千家信息网

MYSQL的字符集是怎样的

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,MYSQL的字符集是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。关于MYSQL的字符集,系统里面有很多个变量设置
千家信息网最后更新 2025年02月01日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的两种字符集进行测试. 我们可以把它理解为应用.)

SSHTERMCHAR_clientCHAR_connectiontutf_dumptgbk_dumptlatin1_dumptutf_warningtgbk_warningtlatin1_warning
gbkutf8utf8203f3fIncorrect '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 xE4xB8xAD
E4B8ADgbkutf8e6b693e4b83fCLENT转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 ;

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

字符 字符集 数据 处理 成功 乱码 时报 问题 测试 变量 情况 结果 清楚 东西 命令 时候 服务器 环节 过程 还是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器软件排名统计 东方公司是一家从事软件开发 vs项目关联的数据库 测试环境数据库怎么打开 软件开发有限公司是做什么的 山东常见软件开发预算 2018网络安全技术对抗赛结果 幻塔2.0版本进入不了服务器 软件开发工作试用期一般多久 社会发展对网络技术 dz论坛数据库效验 如何使电脑无法恢复数据库 ipv6根服务器是华为的吗 华为手机的软件开发商 美食大战老鼠服务器蓝屏怎么办 山西pdu服务器电源哪个牌子好 2022年颁布网络安全的法律 工业园区互联网软件开发报价方案 郑州大学数据库系统原理实验报告 数据库中存储的是数据 小米手机服务器选哪个 软件开发测试管理制度 贵州数据网络技术分类工程 猎户座服务器管理软件 远程桌面服务器怎么打开管理器 扬州工业网络安全 介绍软件开发的过程 服务器KB5006670补丁 工业网络技术试题和答案 高科技互联网推广平均价格
0