视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
数据库字符集和编码转换
2020-11-09 15:31:12 责编:小采
文档

数据库管理系统支持某种编码,主要涉及三个方面: 数据库服务器支持。 数据访问接口支持。 客户端工具支持。 1 数据库服务器字符编码 : 数据库服务器支持某种编码,是指数据库服务器能够从客户端接收、存储以及向客户端提供该种编码的字符(包括标识符、字

数据库管理系统支持某种编码,主要涉及三个方面:

数据库服务器支持。

数据访问接口支持。

客户端工具支持。

1 数据库服务器字符编码:

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

1.1指定数据库服务器编码:

Postgresql:

创建数据库时指定:

CREATE DATABASE … ENCODING …

可以取ASCII、UTF-8、EUC_CN、……

1.2查看数据库编码

Postgresql:

show server_encoding

2 数据库访问接口编码

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

以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)

3 客户端编码

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

3.1 Postgresql指定会话的客户端编码

SET CLIENT_ENCODING TO 'value'

3.2查看数据库编码

Show client_encoding

4 查看字符不同编码的二进制字符串

下面是几个字符在不同编码下数据库中的二进制存储串,Postgresql中Select decoding(name,’escape’) from test可以查看数据库服务器中二进制串。

4。1 以“贝钢”为例

GBK编码为:B1B4 B8D6

UTF-8编码为:E8B49D E992A2

GB18030编码为:B1B4 B8D6

4。2 以“”为例
GBK编码为:FE57 FE54

UTF-8编码为:EEA09C EEA099

GB18030编码为:8336C9388336C935

5 编码转换示例

下面通过具体的例子看一下,这个例子中客户端使用GBK/GB18030编码,接口两端使用GBK18030编码,数据库服务器使用UTF-8编码:



转换涉及:

应用程序中编码和连接客户端编码之间的转换

连接服务器端编码和数据库服务器编码之间的转换

在上图中以橙红色箭头表示

以“”为例,不同编码下在数据库服务器中的二进制串分别为:

GBK编码为:FE57 FE54

UTF-8编码为:EEA09C EEA099

GB18030编码为:8336C9388336C935

Socket:

编程接口保证发送给服务器端的字符编码和当前会话的client_encoding保持一致。

可以将client_encoding设成从应用程序获得的字符的当前编码

也可以获得当前会话的client_encoding,将从应用程序获得的字符转化成client_encoding设置的编码

Server:

client_encoding和server_encoding 之间的转换

根据数据库编码转换算法转换,把目标编码中没有的做法转换成问号“

6平时遇到的问题

对字符进行了错误的编码解析,导致出现乱码。

字符在两个字符集中都存在,导致这部分字符变成“

下载本文
显示全文
专题