加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL的字符集是怎样的

发布时间:2021-12-18 13:21:01 所属栏目:MySql教程 来源:互联网
导读:MYSQL的字符集是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 关于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  转化---> $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 ;
 
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读