您可以指定数据库中服务器的编码格式,作为数据库数据的存储格式。本文以示例的形式介绍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字符集向下兼容。
  • UTF8和GBK中字符长度不同。例如,一个非生僻汉字在GBK中长度为2,在UTF8中长度为3,使用时需要注意字符语义。
  • 创建数据库时根据自己的业务特性,需要指定LC_COLLATELC_CTYPE属性,不同字符集的排序规则可能不同。

示例

  • 指定GBK编码格式。
    1. 创建数据库db_gbk ,并指定服务器编码格式为GBK,客户端编码格式为UTF-8。
      CREATE DATABASE db_gbk template template0 encoding = gbk LC_COLLATE = 'zh_CN.gbk' LC_CTYPE = 'zh_CN.gbk';
      \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 = 'zh_CN.gb18030' LC_CTYPE = 'zh_CN.gb18030';
      \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)