数据仓库服务 GAUSSDB(DWS)-GDS导入/导出类问题:字符集

时间:2024-07-01 10:52:01

字符集

PG里面的字符集支持各种字符集存储文本,包括单字节字符集,比如ISO 8859系列,以及多字节字符集,比如EUC(扩展Unix编码Extended Unix Code)、UTF-8和Mule内部编码。MPPDB中目前主要使用的字符集包括GBK、UTF-8和LATIN1。所有被支持的字符集都可以被客户端透明地使用,但少数只能在服务器上使用(即作为一种服务器端编码,GBK编码在PG中只是客户端编码,不是服务端编码,MPPDB将GBK引入到服务端编码,这是很多问题的根源)。默认的字符集是在使用initdb初始化PG数据库时选择的。在创建一个数据库实例时可以重载字符集,因此可能会有多个数据库实例并且每一个使用不同的字符集。一个重要的限制是每个数据库的字符集必须和数据库LC_CTYPE(字符分类)和LC_COLLATE (字符串排序顺序)设置兼容。对于C或POSIX,任何字符集都是允许的,但是对于其他区域只有一种字符集可以正确工作。不过,在Windows上UTF-8编码可以和任何区域配合使用。

SQL_ASCII设置与其他设置表现得相当不同。如果服务器字符集是SQL_ASCII,服务器把字节值0-127根据ASCII标准解释,而字节值128-255则当作无法解析的字符。如果设置为SQL_ASCII,就不会有编码转换。因此,这个设置基本不是用来声明所使用的指定编码,因为这个声明会忽略编码。在大多数情况下,如果使用了任何非ASCII数据,那么使用SQL_ASCII设置都是不明智的,因为PG将无法帮助你转换或者校验非ASCII字符。

数据库系统支持某种编码,主要涉及三个方面:数据库服务器支持,数据访问接口支持以及客户端工具支持。

  • 数据库服务器字符编码

    数据库服务器支持某种编码,是指数据库服务器能够从客户端接收、存储以及向客户端提供该种编码的字符(包括标识符、字符型字段值),并能将该种编码的字符转换到其它编码(如UTF-8编码转到GBK编码)。

    指定数据库服务器编码:创建数据库时指定:CREATE DATABASE … ENCODING … //可以取ASCII、UTF-8、EUC_CN、……;

    查看数据库编码:show server_encoding。

  • 数据库访问接口编码

    数据库访问接口支持某种编码,是指数据库访问接口要做到能对该种编码的字符进行正确读写,不应出现数据丢失、数据失真等情况。以JDBC接口为例:

    JDBC接口一般根据JVM的file.encoding设置client_encoding:set client_encoding to file_encoding;

    将String转换成client_encoding编码的字节流,传给服务器端:原型String.getBytes(client_encoding) ;

    收到服务器的字节流后,使用client_encoding构造String对象作为getString的返回值给应用程序:原型String(byte[], …, client_encoding)。

  • 客户端编码

    客户端工具支持某种编码,是指客户端工具能够显示从数据库读取该种编码的字符,也能通过本工具将该种编码的字符提交到服务器端。

    指定会话的客户端编码:SET CLIENT_ENCODING TO 'value';

    查看数据库编码:Show client_encoding。

support.huaweicloud.com/trouble-dws/dws_09_0056.html