MYSQL的字符集是怎样的

网友投稿 191 2023-12-24

MYSQL的字符集是怎样的

MYSQL的字符集是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

关于MYSQL的字符集,系统里面有很多个变量设置,很多初学者都不太搞得清楚,包括我自己也是.

所以在这里写点东西,希望把这几个东西的关系搞清楚.

MYSQL的字符集变量可以通过以下命令得到:

show variables like char%;

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | gbk                        |

| character_set_connection | gbk                        |

| character_set_database   | utf8                       |

| character_set_filesystem | binary                     |

| character_set_results    |                            |

| character_set_server     | utf8                       |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

MYSQL的字符集变量其实可以分为两类,

一类是关于创建OBJECTS时要用到的.

character_set_database

 character_set_server

一类是在服务器处理连接的时候要用到的.

character_set_client

 character_set_connection                                        

 character_set_results

我们主要关注的是处理连接的字符集.

关注字符集问题,那你肯定是遇到了乱码的问题. 其实解决乱码问题在网上一搜一大堆.

如果能做到, 应用/MYSQL.CLENT/MYSQL.CONNETION/表/MYSQL.RESULT 的字符集一致,存取数据肯定没有问题.

我在这里把这三个连接字符集的关系理理.

经过多次的测试,我把MYSQL处理字符的过程主要归纳为:

例: WINDOWS客户端CHARSET=GBK,输入"中" , 通过WINDOWS.GBK转码为 $a = D6D0,

================================================================================

# 服务器收到CLIENT送来的值"D6D0", 并认为"D6D0"是$MYSQL.character_set_client 指定字符集的数据.

# 从 $MYSQL.character_set_client  转化---&gt $MYSQL.character_set_connection (如果字符集一样就不转换

)

    if 转换成功 ; then

       $a = $MYSQL.character_set_client.code  

    else

       $a = 3f (在这个环节不会报错!)

    fi  

 # 从 $MYSQL.character_set_connection  转化---&gt $TABLES.character_set (如果字符集一样也会检查一次

)

if 转换成功 ; then

       $a = $MYSQL.character_set_client.code  , 并存入表

    else

       $a = 3f , 并报错: Incorrect string value

$a = 20 ($MYSQL.character_set_connection = $TABLES.character_set 的情况

)

    fi

 # 从数据库取数据.

#   从 $TABLES.character_set --> $MYSQL.character_set_result

    if 转换成功 ; then  

       $a = $MYSQL.character_set_result.code  , 正常显示

    else

$a = 3f/乱码 , 显示: ?或者乱码

   fi
========================================================================================

以下是我测试过程中记录的各种情况及报错信息,以便大家分析:

(在这里我特意用了SSHTERM的两种字符集进行测试. 我们可以把它理解为应用.)

SSHTERMCHAR_clientCHAR_connectiontutf_dumptgbk_dumptlatin1_dumptutf_warningtgbk_warningtlatin1_warninggbkutf8utf8203f3f

Incorrect xD6xD0

存入表UTF8转UTF8,这个环节字符集一样也转换一次.但在源字符集中没找到.返回"空"

Incorrect  xD6xD0

存入表,用UTF8转GBK时报错

Incorrect  xD6xD0

存入表,用UTF8转LATIN1时报错
gbkgbke4b8add6d03f正常正常

Incorrect  xD6xD0

存入表时用GBK转LATIN1时报错
D6D0latin1latin1c396c3903f3fd6d0

正常:(存了UTF8的D6D0)

如果以LATIN1取还是"D6D0"

Incorrect  xD6xD0

LATIN1转GBK报错
正常gbkutf8e4b8add6d03f正常正常

Incorrect xE4xB8xAD

存入表,用UTF8转LATIN1时报错
utf8gbk3f3f3fCLIENT向CONN转换时已经丢了数据成3F,这中间的转换不会报错utf8gbkgbke6b693e4b83f

Data truncated

"E4B8AD"只取了_GBK "E4B8"

Incorrect xAD

"E4B8AD"被两分了两段,而AD没能转换成功.
Incorrect xE4xB8xAD在CONN向表转换的时候,上面两个的处理结果为什么不一样呢?utf8utf8e4b8add6d03f正常正常Incorrect xE4xB8xADE4B8ADgbkutf8e6b693e4b83f

CLENT转CONN数据被截取,

但这样的处理不会报错.

CLENT转CONN数据被截取,

但这样的处理不会报错.
Incorrect  xE6xB6x93utf8gbke4b8add6d03f正常正常Incorrect  xD6xD0latin1latin1c3a4c2b8c2ad3f3f3fe4b8ad理论上这是"E4B8AD"UTF8的CODE,但又有点不像

xE4xB8xAD

LATIN1向GBK转不成功
正常

上表中,只要DUMP结果为e4b8ad/d6d0,说明数据存储都是正常的.而且可以正常读取.

DUMP结果为c396c390的情况比较特殊.读者稍加分析应该还是能明白的.(其实就是原存原取).

相关命令:

创建测试表:                                                                  

create table tutf (name char(10)) engine=myisam default character set=utf8 ;

create table tgbk (name char(10)) engine=myisam default character set=gbk ;

create table tlat (name char(10)) engine=myisam default character set=latin1 ;

设置相关字符集:

set character_set_client=gbk ;

set character_set_connection=utf8;

set character_set_results=latin1;  

插入并DUMP数据:

truncate table tutf;truncate table tgbk;truncate table tlat;

insert into tutf values (中);   show warnings ;

insert into tgbk values (中);   show warnings ;

insert into tlat values (中);    show warnings ;

system  hexdump /home/mysql/data/test/tutf.MYD ;

system  hexdump /home/mysql/data/test/tgbk.MYD ;

system  hexdump /home/mysql/data/test/tlat.MYD ;

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:警务综合平台的技术创新如何推动执法工作的发展?
下一篇:怎么理解Xtrabackup
相关文章

 发表评论

暂时没有评论,来抢沙发吧~