mysql 乱码产生探讨(2)
3。改成set character_set_results=gb2312;
一样是乱码
4。结论:
乱码的产生,是由于单字节向多字节扩展引起的。B0A2 如果作为单字节存储(虽然表示的是1个汉字,但是因为是latin1单字节,所以认为B0A2是不相关的两个字符),此时如果把character_set_results变成utf8多字节,那么数据库mysql 会试图把每个单字节扩展成近似的(不知道具体的算法)双字节。所以乱码
反之,多字节向单字节转换时,不会有变动,仅仅是原来2各字节表示的一个字符‘B0A2’变成了表示两个字符而已。---- 这个说法经验证是错误的。
数据库存储的内容(磁盘上,内存里)不会受character_set_的影响,只是提交,查询的过程中,受到字符集转换的影响。
实验二
1。
create table y (id int, name char(4)) default charset gb2312;
2。在不改变默认character_set_ 是latin1的情况下,如果插入一个汉字,则显示乱码
3。改成set names gb2312,显示没问题(cmd窗口中,cmd窗口代码页936)
4。我原以为如上述实验1种的结论2,“多字节向单字节转换时,不会有变动”。所以我开始以为,set names gb2312 后,把character_set_results 改成latin1,显示不会出问题。结果,
一个汉字,则显示一个问号;两个汉字,则显示两个问号的乱码(估计一个问号代表一个字符)。也就是说,改成character_set_results = latin1后,多字节的数据存储,在向单字节表示转换时,mysql把提出的信息“缩水了”,把两个字节,换算成了一个字节。
5。如何,不让mysql缩水呢,我想到了character_set_results = binary;结果,果然显示正常。
PS
开发的使用mysql的应用程序,是对应作为独立的使用自己的character_set_client的字符集的
cmd 窗口登陆mysql,也是作为一个独立的,拥有自己character_set_client变量的应用
同理,打开不同的cmd窗口,都拥有独自的character_set_client变量
实验三07/16/2010
1。建一个默认字符集utf8的表(用navicat ,在utf8的界面下 代码页65001),并且插入utf8编码的汉字‘大学’
2。切换到mysql console(代码页936)
3。set names gbk; 然后显示刚才所建立的表,能正确现实吗?---- 能!当然,只把character_set_results 成gbk,也能正常显示
实验四
1。mysql console(代码页936)建立一个表x3 ( name char(32) ),默认字符集default charset gbk;
2。默认环境变量
| character_set_client | latin1
| character_set_connection | latin1
| character_set_database | latin1
| character_set_filesystem | binary
| character_set_results | latin1
| character_set_server | latin1
| character_set_system |utf8 //不知道对以下过程、分析是否有影响
character_set_client character_set_connection character_set_results 是latin1的情况下,插入数据:insert x3 values('大');
显示:ERROR 1406 (22001): Data too long for column 'name' at row 1
3。set character_set_client=gbk;然后insert x3 values('大');插入没有问题,但显然,数据经过 (character_set_connection=latin1)的转换,已经是有损了
相关新闻>>
- 发表评论
-
- 最新评论 更多>>