首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL 编码和解码

背景:目前正在进行业务重构,需要对使用MySQL的业务库表进行重新设计,在迁移时,遇到了中文字符乱码问题(源库表的默认编码是LATIN1,新库表的默认编码为UTF8),故重新学习了下MySQL编码和解码相关知识...根据字符编码转换成二进制流,并传输到MySQL Server; 2、MySQL Server收到请求时将请求数据data从character_set_client转换为character_set_connection...4、引擎层读写存储文件,涉及内部操作字符集与二进制流之间的相互转换; 5、将操作结果从内部操作字符集转换为character_set_results; 6、MySQL Client接收到数据后,根据本地配置的字符编码展示查询结果...此时通过设置character_set_results分别为gbk、utf8latin1时,查看下test表中的数据: MySQL [CCDB4_SRC]> set names gbk; MySQL...utf8) utf8,BINARY CONVERT(latin1 USING utf8) latin1 FROM test WHERE set_names='utf8' -> UNION

5.6K20

Mysql字符编码利用技巧

如上图,在默认情况下,mysql字符集为latin1,而执行了set names utf8;以后,character_set_client、character_set_connection、character_set_results...2008年鸟哥曾在博客中讲解了Mysql字符集: MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection; 进行内部操作前将请求数据从...于是,整个操作就有如下字符串转换过程: utf8 --> utf8 --> latin1 最后执行比较username='admin'的时候,'admin'是一个latin1字符串。...0x04 漏洞成因 那么,字符集转换为什么会导致%c2被忽略呢? 说一下我的想法,虽然我没有深入研究,但我觉得原因应该是,Mysql在转换字符集的时候,将不完整的字符给忽略了。...原因很简单,因为latin1并不支持汉字,所以utf8汉字转换成latin1时就抛出了错误。 那前两次为什么没有抛出错误?因为前两次输入的编码并不完整,Mysql在进行编码转换时,就将其忽略了。

1.6K20

pt-osc改表过程中的中文乱码问题

1 row in set (0.00 sec) 这个结果中,我们可以看到2点: 1、我们的表latin_test1的字符集仍旧是latin1,而没有被改成utf8的字符集 2、表中的中文注释已经可以显示了...UTF8。...如果我们使用latin1这个字符集,则说明pt-osc工具和mysql交互的字符集是latin1,而这个字符集是无法保存汉字的,所以结果中就出现了????的字眼。...如果删除的这个数据还未导入到新表,那么我们可以不在新表执行操作,因为在以后的导入过程中,原表中改行数据已经被删除,已经没有数据,那么这条记录也就不会导入到新表中; (2)对于INSERT操作,所有的INSERT INTO全部转换为...如果触发器还未把原表数据同步到新表,而这条数据已经被pt工具导入到新表了,再次insert就会发生报错,那么我们就可以利用replace into进行覆盖,这样数据也是一致的 (3)对于UPDATE操作,所有的UPDATE也转换为

1.5K10

MySQL字符集详解

为例,生产中多数时linux,在linux里面除了latin1之外都是utf8的字符集):     mysql> show variables like "%char%";     +--------...比如:linux系统的终端编码是UTF8,系统默认语言和编码为zh_CN.UTF8.我们有一个数据库名为test,test中有个表名为t1,编码为latin1,另外,我们在mysqlclient运行了SET...,比如我们mysql设置的utf8编码的格式存储的文件路径,但是系统默认是gbk编码的,那么文件在保存到系统里的时候,文件的名称和你存在mysql里面的文件名称就对应不上了,出现乱码显示的问题,所以也要注意系统的编码...标记如latin1utf8,则不会进行这一步转换).转换完毕,才会真正运行sql语句. 2.进行内部操作前将sql语句中的数据从character_set_connection转换为数据表中对应字段的编码.... 3.将操作结果从内部字符集编码转换为character_set_results编码.

3.3K10

mysql编码问题——charset=utf8你真的弄明白了吗?

当经过连接器的时候,连接器会进行"字符集的自动转换",将原来的子符(以GBK进行编码)转换为UTF8格式的编码字符,临时存储在连接器中。   ...因此,连接器会进行"字符集的自动转换",将返回的结果(以UTF8进行编码)转换为以GBK格式的编码,进行显示,并最终发送给客户端,显示在CMD窗口中。...因此,连接器此时又会进行"字符集的自动转换",将该字符(以GBK进行编码)转换为UTF8格式的编码,进行显示,转换完成以后,再次发送给mysql服务器,进行最终的存储。...唯一不同的就是系统默认mysql服务器的字符集是latin1,而图二中mysql服务器的字符集是utf8。 “系统为什么将mysql服务器默认使用latin1字符集?你可以自行百度。”   ...因为latin1不支持中文,当我们插入中文的时候,当客户端发送过去的字符,通过连接器,最后发送给mysql服务器的时候,连接器发现mysql服务器采用的字符级是latin1,字符集由gbk转化为latin1

1.6K60

深入理解MySQL字符集及校对规则(二)

MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection; ②进行内部操作前将请求数据从character_set_connection...,分别为gbk编码,utf8编码以及latin1编码.之所以这样创建,正是为了验证mysql字符集编码的转换过程。...接下来看gbk字段,它的编码是gbk,这时会将原始编码s=”\xE4\xB8\xAD\xE6\x96\x87″依照utf8编码转换为GBK编码,即运行s.decode(‘utf8’).encode(‘gbk...最后,看latin_utf8字段,相同须要转换编码,因为latin1表示不了utf8编码的范围,所以s.decode(‘utf8’).encode(‘latin1′)这个转换过程会出错,导致的结果就是latin_utf8...转换为character_set_connection的时候会忽略latin_utf8的转换,所以还是保持原来的utf8字符,接下来将其存入到latin1字段中,亦不会有问题,由于编码同样,不须要转换,

1.9K10

MySQL的字符集和乱码问题

数据字符串的存储方式,校对规则是定义比较字符串的方式 #扩展 #字符编码:就是人类使用的英文字母、汉字、特殊符号等信息,通过转换规则,将其转换为计算机可以识别的二进制数字的一种编码方式 #mysql数据库常见字符集...常用字符集  长度 说明 GBK       2 不是国际标准 UTF-8     3 中英文混合的环境,建议使用 Latin1     1 mysql默认字符集...-uroot -p --default-character-set=latin1; Enter password: mysql> show variables like 'character_set...=utf8 #3.mysql客户端 #在/etc/my.cnf文件里面添加客户端模块,无需重启 [client] default-character-set=utf8 #4.mysql库表,一般上面几个改完...,库表都会随着mysql的字符集 mysql> create database data_utf8 character set=utf8; Query OK, 1 row affected (0.01

2.1K30

那些坑人的乱码问题(下)

实例收到客户端请求后,将其转换为character_set_connection字符集; 3、MySQL进行内部操作时,将数据字符集转换为内部操作字符集(使用每个数据字段的character set设定值...它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介词)。...、character_set_results均为latin1;插入操作的数据将经过latin1–>latin1–>utf8的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存;...举例说明:假设我们有一张通过错进错出(set names latin1)存入了UTF-8的数据、编码是latin1的表,并打算把表的字符集编码改成UTF-8(同时set names utf8)并且不影响原有数据的正常显示...在将有编码意义的数据流转换为无编码意义的二进制数据的时候并不做实际的数据转换,而从二进制数据准换为带编码的数据时又会用目标编码做一次编码转换校验,利用这两个特性就可以实现在MySQL内部模拟了一次“错出

1.9K20

深入理解MySQL字符集及校对规则(一)

它把客户端传来的语句,从character_set_client字符集转换成character_set_connection字符集(除非字符串中有类似_latin1或者_utf8的字符集声明)。...这样的文件名转换为character_set_filesystem character_set_client之前打开文件的尝试时。默认值是二进制的,这意味着不发生转换。...1、安装MySQL时使用了一个默认的服务器字符集,这个字符集是Latin1。 2、编译MySQL时可以手动指定一个默认服务器字符集和校对规则,参数为: cmake ....MySQL客户端的编码方式(所以此参数需要正确反映客户端对应的编码) ③当MySQL发现客户端的client所传输的字符集与自己的connection不一样时,会将client的字符集转换为connection...character_set_results来体现,服务器询问客户端字符集,通过character_set_results将结果转换为与客户端相同的字符集传递给客户端。

1.3K10

10分钟学会理解和解决MySQL乱码问题

又或者存入MySQL的时候set names utf8(C2),而取出的时候却使用了set names gbk(C2′),那么结果也必然是乱码 2....例如:我们的shell是UTF8编码,MySQL的character-set-client配置成了GBK,而 表结构却又是charset=utf8,那么毫无疑问的一定会出现乱码。...可见在被MySQL Server接收到以后实际上已经发生了编码不一致的情况。但是由于Latin1字符集对于自己表述范围外的字符不会做任何处理,而是保留原值。这样的行为也使得错进错出成为了可能。 ?...由于,MySQL再将有编码意义的数据流,转换为无编码意义的二进制数据的时候 并不做实际的数据转换。而从二进制数据准换为带编码的数据时,又会用目标编码做一次编码转换校验。...通过这两个特性就相当于在MySQL内部模拟了一次“错 出”,将乱码“拨乱反正”了。 还是用上面那个例子举例,我们用UTF-8将数据“错进”到latin1编码的表中。

1.2K80
领券