• 金仓数据库KingbaseES本地化支持(5. 字符集)


    本部分包含以下主题:

    5.1. 字符集概念 

    KingbaseES数据库支持各种字符集(也叫编码)来存储文本,包括单字节字符集(如 ISO 8859 系列),以及多字节字符集(如 EUC “扩展 Unix 编码 Extended Unix Code” 、UTF-8 和 Mule 内部编码)。 所有被支持的字符集都可以被客户端透明地使用,但少数只能在服务器上使用(即作为一种服务器方编码)。

    默认的字符集是在使用 initdb 初始化您的KingbaseES数据库集簇时选择的。在您创建一个数据库时可以重载它,因此您可能会有多个数据库并且每一个数据库使用不同的字符集。

    但是,一个重要的限制是每个数据库的字符集必须和数据库的 LC_CTYPE (字符分类)和 LC_COLLATE (字符串排序顺序)设置兼容。对于 或 POSIX 环境,任何字符集都是允许的, 但是对于其他libc提供的环境只有一种字符集可以正确工作(不过,在Windows上UTF-8编码可以和任何环境配合使用)。 如果您配置了ICU支持,则ICU提供的区域设置可用于大多数服务器端编码。

    5.2. 字符集的配置 

    initdb 为KingbaseES数据库定义一个缺省的字符集(编码)。

    例如,将缺省字符集设置为 EUC_JP (用于日文的扩展Unix编码):

    initdb -E EUC_JP
    

    如果您喜欢用长选项字符串,您可以用 --encoding 代替 -E 

    如果没有指定 -E 或者 --encoding 选项, initdb 会尝试基于指定的或者默认的区域判断要使用的合适编码。

    您可以在创建数据库时指定一个非默认编码,提供的编码应和选择的区域兼容:

    createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean
    

    创建一个名为 korean 的数据库,该数据库使用 EUC_KR 字符集和 ko_KR 区域设置。另外一种实现方法是使用 SQL 命令:

    CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr'
    LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
    

    注意上述命令指定拷贝 template0 数据库。在拷贝任何其他数据库时,不能更改从源数据库得来的编码和区域设置,因为这可能会导致破坏数据。详见 模板数据库 。

    数据库的编码存储在系统目录 sys_database 中。你可以使用 ksql -l 选项或者 \l 命令来查看。

    $ ksql -l
                                 List of databases
       Name    |  Owner   | Encoding  |  Collation  |    Ctype    | Access Privileges
    -----------+----------+-----------+-------------+-------------+-------------------
     clocaledb | hlinnaka | SQL_ASCII | C           | C           |
     englishdb | hlinnaka | UTF8      | en_GB.UTF8  | en_GB.UTF8  |
     japanese  | hlinnaka | UTF8      | ja_JP.UTF8  | ja_JP.UTF8  |
     korean    | hlinnaka | EUC_KR    | ko_KR.euckr | ko_KR.euckr |
     kingbase  | hlinnaka | UTF8      | fi_FI.UTF8  | fi_FI.UTF8  |
     template0 | hlinnaka | UTF8      | fi_FI.UTF8  | fi_FI.UTF8  | {=c/hlinnaka,hlinnaka= CTc/hlinnaka}
     template1 | hlinnaka | UTF8      | fi_FI.UTF8  | fi_FI.UTF8  | {=c/hlinnaka,hlinnaka= CTc/hlinnaka}
    (7 rows)
    

    Important

    在大部分现代操作系统上,KingbaseES可以判断 LC_CTYPE 设置哪一种隐含的字符集,并且它将强制只使用匹配的数据库编码。在版本过旧的系统上您需要自己负责确保所使用的编码就是您所设置的区域。这里的一个错误很可能导致区域依赖的操作产生奇怪的行为,例如排序。

    即使 LC_CTYPE 不是 或 POSIX 时,KingbaseES将允许超级用户使用 SQL_ASCII 编码创建数据库。正如前文所述, SQL_ASCII 并不强制存储在数据库中的数据具有任何特定的编码,并且这种选择带来了依赖于区域设置的不正当行为的风险。不推荐使用这种设置组合,可能有一点会被完全禁止。

    5.3. 服务器和客户端之间的自动字符集转换 

    KingbaseES支持服务器和客户端之间的自动编码转换。如果您选择的数据库字符集不同于客户端操作系统上的字符集,那么KingbaseES数据库可以将操作系统字符集转换为数据库字符集。

    转换信息存储在系统目录 sys_conversion 。 KingbaseES自带一些预定义的转换,如 表 6.2.5 所示。

    您可以使用SQL命令 CREATE CONVERSION 创建一个新的转换。

    要想启用自动字符集转换功能,您必须告诉KingbaseES您在客户端使用的字符集(编码)。

    您可以采用以下几种方法来启用自动字符集转换功能:

    • 采用ksql里的 \encoding 命令。 \encoding 允许您动态修改客户端编码。例如,将编码改变为 SJIS 

      \encoding SJIS
      
    • 使用SQL命令 SET client_encoding TO 设置客户端编码:

      SET CLIENT_ENCODING TO 'value';
      

      您还可以采用标准SQL语法里的 SET NAMES 来设置:

      SET NAMES 'value';
      

      查询当前客户端编码:

      SHOW client_encoding;
      

      返回到缺省编码:

      RESET client_encoding;
      
    • 使用 KINGBASE_CLIENTENCODING 。如果在客户端环境里定义了KINGBASE_CLIENTENCODING环境变量,那么在与服务器进行了连接后将自动选择该编码(随后可以用上述的任何其他方法重载)。

    • 使用配置变量 client_encoding 。如果设置了 client_encoding 变量,客户端在与服务器建立了连接之后,客户端编码将被自动选定(随后可以用上述的任何的其他方法重载)。

    如果无法转换特定的字符,则会报错,如您选的服务器编码是 EUC_JP ,而客户端是 LATIN1 ,那么部分日文字符不能被转换成 LATIN1 

    如果客户端字符集定义成了 SQL_ASCII ,无论服务器的字符集是什么,编码转换都将被禁用。和服务器一样,使用 SQL_ASCII 是不明智的,除非你的工作环境全部是 ASCII 数据。

  • 相关阅读:
    CentOS7 安装 NVIDIA Container Toolkit
    Kafka 设计原理
    安卓搞机教程--修改设置里 添加选项 添加文字 修改图标 修改版本号等等 实例解析
    17.Table Api基础概念讲解
    利用大模型MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7实现零样本分类
    SPDK负载均衡初探
    NISP一级考试题库
    Python之第十章 IO及对象列化
    1.4 数据库系统的组成
    Spring Security学习(一)——快速开始
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126704152