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 转化---> $MYSQL.character_set_connection (如果字符集一样就不转换)
if 转换成功 ; then
$a = $MYSQL.character_set_client.code
else
$a = 3f (在这个环节不会报错!)
fi
# 从 $MYSQL.character_set_connection 转化---> $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的两种字符集进行测试. 我们可以把它理解为应用.)
SSHTERM | CHAR_client | CHAR_connection | tutf_dump | tgbk_dump | tlatin1_dump | tutf_warning | tgbk_warning | tlatin1_warning |
gbk | utf8 | utf8 | 20 | 3f | 3f | Incorrect 'xD6xD0' 存入表UTF8转UTF8,这个环节字符集一样也转换一次.但在源字符集中没找到.返回"空" | Incorrect 'xD6xD0' 存入表,用UTF8转GBK时报错 | Incorrect 'xD6xD0' 存入表,用UTF8转LATIN1时报错 |
gbk | gbk | e4b8ad | d6d0 | 3f | 正常 | 正常 | Incorrect 'xD6xD0' 存入表时用GBK转LATIN1时报错 | |
D6D0 | latin1 | latin1 | c396c390 | 3f3f | d6d0 | 正常:(存了UTF8的D6D0) 如果以LATIN1取还是"D6D0" | Incorrect 'xD6xD0' LATIN1转GBK报错 | 正常 |
gbk | utf8 | e4b8ad | d6d0 | 3f | 正常 | 正常 | Incorrect xE4xB8xAD 存入表,用UTF8转LATIN1时报错 | |
utf8 | gbk | 3f | 3f | 3f | CLIENT向CONN转换时已经丢了数据成3F,这中间的转换不会报错 | |||
utf8 | gbk | gbk | e6b693 | e4b8 | 3f | Data truncated "E4B8AD"只取了_GBK "E4B8" | Incorrect 'xAD "E4B8AD"被两分了两段,而AD没能转换成功. | Incorrect 'xE4xB8xAD' |
在CONN向表转换的时候,上面两个的处理结果为什么不一样呢? | ||||||||
utf8 | utf8 | e4b8ad | d6d0 | 3f | 正常 | 正常 | Incorrect xE4xB8xAD | |
E4B8AD | gbk | utf8 | e6b693 | e4b8 | 3f | CLENT转CONN数据被截取, 但这样的处理不会报错. | CLENT转CONN数据被截取, 但这样的处理不会报错. | Incorrect 'xE6xB6x93' |
utf8 | gbk | e4b8ad | d6d0 | 3f | 正常 | 正常 | Incorrect 'xD6xD0' | |
latin1 | latin1 | c3a4c2b8c2ad | 3f3f3f | e4b8ad | 理论上这是"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 ;
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。