字符分类

基本概念

字符分类(Character Type)用于系统判断字符的处理方式。例如一个字符是单字节还是多字节,一个字符是字母还是符号等。

在数据库中,LC_CTYPE 的配置会影响大小转换,例如不被视为字母的字符,就不会被 LOWER()UPPER() 函数转换大小写。有关该行为的示例,参考 示例1:不同字符分类的行为

配置方式

初始化字符分类

在初始化数据库时,LC_CTYPE 默认会根据操作系统的 locale 设置进行选择,也可以通过 --lc-ctype 参数指定。指定 --lc-ctype 时,需要确保该设置与字符集能够匹配。

数据库级字符分类

配置数据库级字符分类的方式与配置排序规则的方式相同,请查阅 数据库级排序规则

  • LC_CTYPE 在数据库创建后不能修改。
  • 数据库的字符分类存储在 PG_DATABASE 系统表中。 可以使用 vsql 的 -l 选项或 \l  命令列出这些字符分类。
    vsql -l
    

示例

示例1:不同字符分类的行为

  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';
    
  2. 切换到 chr1,执行以下语句:
    \c chr1
    SELECT lower('A');
    

    返回结果如下:
    lower
    -------
    a
    (1 row)
    
  3. 切换到 chr2,执行以下语句:
    \c chr2
    SELECT lower('A');
    

    返回结果如下:
    lower
    -------
    A
    (1 row)
    

    这是由于 C 语言的字符分类不会将全角英文字符视为字母,因此不会进行大小写转换。
  4. 清理测试环境。
    DROP DATABASE chr1;
    DROP DATABASE chr2;
    

需要帮助?

扫码添加企业微信
获得专业技术支持

企业微信二维码
🎯 快速响应💡 专业解答