MYSQL的字符集是怎样的

52次阅读
没有评论

共计 3773 个字符,预计需要花费 10 分钟才能阅读完成。

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

关于 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 — gt $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_warninggbkutf8utf8203f3fIncorrect 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, 这中间的转换不会报错 utf8gbkgbke6b693e4b83fData truncated
E4B8AD 只取了_GBK E4B8 Incorrect xAD
E4B8AD 被两分了两段, 而 AD 没能转换成功.Incorrect xE4xB8xAD 在 CONN 向表转换的时候, 上面两个的处理结果为什么不一样呢? utf8utf8e4b8add6d03f 正常正常 Incorrect xE4xB8xADE4B8ADgbkutf8e6b693e4b83fCLENT 转 CONN 数据被截取,
但这样的处理不会报错.CLENT 转 CONN 数据被截取,
但这样的处理不会报错.Incorrect   xE6xB6x93 utf8gbke4b8add6d03f 正常正常 Incorrect   xD6xD0 latin1latin1c3a4c2b8c2ad3f3f3fe4b8ad 理论上这是 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 ;

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计3773字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)