字符分类
基本概念
字符分类(Character Type)用于系统判断字符的处理方式。例如一个字符是单字节还是多字节,一个字符是字母还是符号等。
在数据库中,LC_CTYPE 的配置会影响大小转换,例如不被视为字母的字符,就不会被 LOWER()
或 UPPER()
函数转换大小写。有关该行为的示例,参考 示例1:不同字符分类的行为。
配置方式
初始化字符分类
在初始化数据库时,LC_CTYPE 默认会根据操作系统的 locale 设置进行选择,也可以通过 --lc-ctype 参数指定。指定 --lc-ctype 时,需要确保该设置与字符集能够匹配。
数据库级字符分类
配置数据库级字符分类的方式与配置排序规则的方式相同,请查阅 数据库级排序规则。
- LC_CTYPE 在数据库创建后不能修改。
- 数据库的字符分类存储在 PG_DATABASE 系统表中。 可以使用 vsql 的
-l
选项或\l
命令列出这些字符分类。vsql -l
示例
示例1:不同字符分类的行为
- 创建测试数据库,分别指定 LC_CTYPE 为 zh_CN.gb18030 与 C。
CREATE DATABASE chr1 ENCODING 'GB18030' LC_COLLATE 'zh_CN.gb18030' LC_CTYPE 'zh_CN.gb18030'; CREATE DATABASE chr2 ENCODING 'GB18030' LC_COLLATE 'C' LC_CTYPE 'C';
- 切换到 chr1,执行以下语句:
\c chr1 SELECT lower('A');
返回结果如下:lower ------- a (1 row)
- 切换到 chr2,执行以下语句:
\c chr2 SELECT lower('A');
返回结果如下:lower ------- A (1 row)
这是由于 C 语言的字符分类不会将全角英文字符视为字母,因此不会进行大小写转换。 - 清理测试环境。
DROP DATABASE chr1; DROP DATABASE chr2;