关于mysql字符集的问题

最近写一个小项目。需要用到mysql数据库。
但是字符集问题一直困扰。。
差了许多资料以后明白了很多。但是有个问题还是没弄清楚。

mysql字符集的乱码大约是因为数据库编码、连接编码、和客户端编码3个不统一造成的。


第一个问题是连接编码是负责什么工作的?
进行转码么?

第二个问题。和上个问题差不多。
我现在又一个utf-8的数据库。
然后我在cmd下。直接查询是乱码。插入会报错。
大约是因为cmd的默认编码为gbk。
解决方案是连接的时候设置连接字符集。
mysql-uroot -proot --default-character-set=gbk
这样查询和插入都正常了。但是我想知道我插入的数据时什么编码的?
是不是以gbk插入然后以gbk解析所以没有乱码。


第三个问题。gbk和utf-8是否存在包含关系?或者说是否不需要转码。?

作者: WADS913   发布时间: 2011-06-13

第一个问题是连接编码是负责什么工作的?
进行转码么?

是的,可以这么理解。


但是我想知道我插入的数据时什么编码的?
是不是以gbk插入然后以gbk解析所以没有乱码。

不是,以字段上的字符集设置存储,但如你第一个问题,MYSQL会进行不同字符集间的转换


第三个问题。gbk和utf-8是否存在包含关系?或者说是否不需要转码。?
不是包含,是不同的两种字符集编码方案。 需要转码。

作者: ACMAIN_CHM   发布时间: 2011-06-13

引用 1 楼 acmain_chm 的回复:

第一个问题是连接编码是负责什么工作的?
进行转码么?

是的,可以这么理解。


但是我想知道我插入的数据时什么编码的?
是不是以gbk插入然后以gbk解析所以没有乱码。

不是,以字段上的字符集设置存储,但如你第一个问题,MYSQL会进行不同字符集间的转换


第三个问题。gbk和utf-8是否存在包含关系?或者说是否不需要转码。?
不是包含,是不同的两种字符集编码方……



第二个问题中有点疑问。那连接的编码相当于只和客户端的编码有关系。
主要责任是把数据库的编码转换成连接的编码。但是插入的时候还是按照数据库本身的编码?
所以连接的字符集是需要根据客户端的编码进行设置

作者: WADS913   发布时间: 2011-06-13

客户端 字符集设置 , 你的客户端使用的是什么字符集,有些情况你是没的选的。比如WINDOWS下的DOS无法正常支持UTF8.

连接中的字符集设置, 同样,在某些情况下,连接中的字符集也会受到限制,当然现在这种情况不多。基本上都是用TCP通讯了。

字段的 字符集,这个是实际存储在表中的字符集。 (注意不存在什么 数据库本身的字符集。)

作者: ACMAIN_CHM   发布时间: 2011-06-13

引用 3 楼 acmain_chm 的回复:

客户端 字符集设置 , 你的客户端使用的是什么字符集,有些情况你是没的选的。比如WINDOWS下的DOS无法正常支持UTF8.

连接中的字符集设置, 同样,在某些情况下,连接中的字符集也会受到限制,当然现在这种情况不多。基本上都是用TCP通讯了。

字段的 字符集,这个是实际存储在表中的字符集。 (注意不存在什么 数据库本身的字符集。)


我想问的问题是。
连接字符集所起的作用大约流程;
我想象中的流程是。查询时读出要查询的数据。然后经过连接的时候根据连接的字符集进行转码。然后显示在客户端。
插入的时候是不是也把要插入的语句转化成连接的编码。然后插入数据库中。

例如utf-8的字段(谢谢纠正)和gbk的cmd命令行
正常查询会是乱码。设置了连接字符集为gbk以后正常
所以
我查询的时候把utf-8的字段数据经过连接设置的gbk编码以后。转换成gbk编码显示在cmd的界面中。

但是我插入的时候为什么不是gbk的数据。经过连接设置的gbk编码以后以gbk编码的格式插入进去。


所以设置连接编码是不是仅仅针对客户端起作用的。而不是双向的?

作者: WADS913   发布时间: 2011-06-13