文档

指定服务器编码格式

更新时间:

您可以指定数据库中服务器的编码格式,作为数据库数据的存储格式。本文以示例的形式介绍PolarDB兼容的GBK与GB18030两种编码格式的使用方法。

简介

  • GBK

    GBK(Chinese Internal Code Specification)即汉字内码扩展规范 。GBK共收录21886个汉字和图形符号,包括:

    • GB2312中的全部汉字和非汉字符号。

    • BIG5中的全部汉字。

    • 国家标准GB13000中的其它CJK汉字。

    • 其它汉字、部首和符号。

  • GB18030

    GB18030即国家标准GB18030-2005《信息技术中文编码字符集》,是GB18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》的修订版,也是最新的汉字编码字符集国家标准。向下兼容GBK和GB2312标准,共收录70244个汉字。且采用多字节编码,每个字可以由单字节、双字节或四字节组成。其中单字节、双字节和GBK完全兼容。四字节编码的码位为CJK扩展A的6582个汉字。编码空间庞大,最多可定义161万个字符。支持中国内地所有的文字。汉字收录范围包含繁体汉字以及日韩汉字。

注意事项

  • 如果Oracle是GBK字符集,建议使用GB18030字符集。因为Oracle中GBK字符集的字符数量会大于PolarDB中的GBK字符集的字符数量,实际类似于PolarDB中的GB18030,而且GB18030字符集对GBK字符集向下兼容。

  • UTF-8和GBK中字符长度不同。例如,一个非生僻汉字在GBK中长度为2,在UTF-8中长度为3,使用时需要注意字符语义。

  • 创建数据库时根据自己的业务特性,需要指定LC_COLLATELC_CTYPE属性,不同字符集的排序规则可能不同。

    说明

    由于编码内部原因,强烈建议您不要将LC_CTYPE属性设置为‘zh_CN.gbk’或‘zh_CN.gb18030’,可能导致某些函数(例如upper)的结果出现异常。

示例

  • 指定GBK编码格式。

    1. 创建数据库db_gbk ,并指定服务器编码格式为GBK,客户端编码格式为UTF-8。

      CREATE DATABASE db_gbk template template0 encoding = gbk LC_COLLATE = 'C' LC_CTYPE = 'C';
      \c db_gbk;
      SET client_encoding = 'utf-8';
    2. 创建test_table表。

      CREATE TABLE test_table(f1 varchar(3));
    3. test_table表中插入数据。

      INSERT INTO test_table (f1) VALUES ('张三');
      INSERT INTO test_table (f1) VALUES ('李四');
      INSERT INTO test_table (f1) VALUES ('王先生');
      INSERT INTO test_table (f1) VALUES ('张女士');
    4. 查询test_table表中的全量数据,并按照升序排列。

      SELECT * FROM test_table ORDER BY f1;

      查询结果如下:

       李四
       王先生
       张女士
       张三
      (4 rows)
  • 指定GB18030编码格式。

    1. 创建数据库db_gb18030,并指定服务器编码格式为GB18030,客户端编码格式为UTF-8。

      CREATE DATABASE db_gb18030 template template0 encoding = gb18030 LC_COLLATE = 'C' LC_CTYPE = 'C';
      \c db_gb18030;
      SET client_encoding = 'utf-8';
    2. 创建polar_text表。

      CREATE TABLE polar_text(i int, f1 text);
    3. polar_text表中插入数据。

      INSERT INTO polar_text (f1) VALUES ('张三');
      INSERT INTO polar_text (f1) VALUES ('李四');
      INSERT INTO polar_text (f1) VALUES ('王先生');
      INSERT INTO polar_text (f1) VALUES ('€张女士');
    4. 查询polar_text表中的全量数据,并升序排列。

      SELECT * FROM polar_text ORDER BY f1;

      查询结果如下:

       i |     f1
      ---+------------  
         | 李四
         | 王先生 
         | €张女士
         | 张三
      (4 rows)