select * from A order by cast(name as unsigned);
下面看一些例子,第一个看UTF8转GBK:text = "数据库"utf8_encoded = text.encode('UTF8')print(utf8_encoded)encoded_text_gbk...再看一个例子,GBK转UTF8,这种转换其实 99%不可以,只有少数可以,如"平遥"text = "平遥"gbk_encoded = text.encode('GBK')print(gbk_encoded...这也是为什么MySQL可以用latin1字符集存GBK或者UTF8汉字的原因。...->latin1->gbk 注意 B0转为A1E3 93转为A1B0select hex(convert(CONVERT(UNHEX( ‘E695B0E68DAEE5BA93′) USING latin1...,显示的时候做了转换,但GBK直接换为UTF8,绝大部分字符都无法转换,显示为"�"号。
作者:龙述兵 问题描述 假设有三个表test_gbk,test_utf8,test_latin1,创建的时候字符集分别为gbk,utf8,latin1。...Character_set_client告诉MySQL Server,传入的是一个latin1编码的,也就是单字节流,'中'这个输入,其实当作了0xD6 D0传入。...Character_set_client告诉MySQL Server,传入的是一个latin1编码的,'中'这个输入,当作了0xD6 D0传入。...-> latin1, 其中latin1-> utf8的时候,输入'中' (0xD6 D0)会当作两个字符进行utf8转换,转换为0xC3 96 C3 90,然后utf8->latin1的时候,会把0xC3...96转换成0xD6, 0xC3 90转成0x D0,最后输出0xD6 D0。
背景:目前正在进行业务重构,需要对使用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、utf8、latin1时,查看下test表中的数据: MySQL [CCDB4_SRC]> set names gbk; MySQL...utf8) utf8,BINARY CONVERT(latin1 USING utf8) latin1 FROM test WHERE set_names='utf8' -> UNION
ASCII编码和Latin1编码格式时,每个中文字符会被转换为0x3F,即中文字符’?’。...=utf8 2、MySQL字符集 MySQL服务器可以支持多种字符集,提供了不同级别的设置,包括server级、database级、table级、column级。...[mysqld] character_set_server=utf8 重启MySQL数据库服务生效。...=utf8; E、客户端字符集 修改MySQL服务器配置文件/etc/my.cnf文件。...将UTF-8字符转换为GBK字符时,MySQL内部如果无法在GBK字符集找到一个UTF8字符集中的字符时,就会转换成一个错误标记(0x3F,问号)。
节选自 《Netkiller MySQL 手札》 MySQL 数据库将latin1 转换为 UTF-8有几种方案。...导出,iconv转换,再倒入 MySQL 5.x 以后可能支持导出UTF8,在导入UTF8 通过convert 函数转换。 第一种与第二种都需要做导出操作,会涉及到锁表,需要数据库管理员操作。...转换 latin1 到 UTF-8 UPDATE category SET name=convert(cast(convert(name using latin1) as binary) using...utf8), description=convert(cast(convert(description using latin1) as binary) using utf8)
如上图,在默认情况下,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 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也转换为
character_set_server utf8 character_set_system utf8 character_sets_dir /usr/local/Cellar/mysql...所有Latin-1字符都能转换为UTF-8字符,但不一定能转换为GBK字符。 以上几点为MySQL“错进错出”提供了条件。...不直接登陆MySQL,而是在Shell中先将查询语句转化为GBK编码,再传入MySQL: echo " SET names latin1; SELECT * FROM student WHERE name...= '小明';"\ | iconv -f utf8 -t gbk\ | mysql -uroot -p123 -Dtest 其中iconv的作用是将标准输入转换为指定的编码格式(这里是GBK),再通过标准输出传递给...echo " SET names latin1; SELECT * FROM student WHERE name = '小明';"\ | iconv -f utf8 -t gbk\ | 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里面的文件名称就对应不上了,出现乱码显示的问题,所以也要注意系统的编码...标记如latin1或utf8,则不会进行这一步转换).转换完毕,才会真正运行sql语句. 2.进行内部操作前将sql语句中的数据从character_set_connection转换为数据表中对应字段的编码.... 3.将操作结果从内部字符集编码转换为character_set_results编码.
当经过连接器的时候,连接器会进行"字符集的自动转换",将原来的子符(以GBK进行编码)转换为以UTF8格式的编码字符,临时存储在连接器中。 ...因此,连接器会进行"字符集的自动转换",将返回的结果(以UTF8进行编码)转换为以GBK格式的编码,进行显示,并最终发送给客户端,显示在CMD窗口中。...因此,连接器此时又会进行"字符集的自动转换",将该字符(以GBK进行编码)转换为以UTF8格式的编码,进行显示,转换完成以后,再次发送给mysql服务器,进行最终的存储。...唯一不同的就是系统默认mysql服务器的字符集是latin1,而图二中mysql服务器的字符集是utf8。 “系统为什么将mysql服务器默认使用latin1字符集?你可以自行百度。” ...因为latin1不支持中文,当我们插入中文的时候,当客户端发送过去的字符,通过连接器,最后发送给mysql服务器的时候,连接器发现mysql服务器采用的字符级是latin1,字符集由gbk转化为latin1
①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字段中,亦不会有问题,由于编码同样,不须要转换,
-> CONV(15,10,2), # 将10进制的15转换为2进制 -> CONV(15,10,8), # 将10进制的15转换为...8进制 -> CONV(15,10,16); # 将10进制的15转换为16进制 ?...3、 IP 地址与数字互相转换的函数 INET_ATON(expr) :用于将网络地址转 换为一个代表该地址数值的整数 mysql> select INET_ATON('192.168.1.1'...mysql> select CAST(100 AS CHAR(2)); # 将整数类型100转换为带有两个显示宽度的字符串类 型,结果为'10' ?...mysql> select CONVERT(100,CHAR(2)); # 将整数类型的100转换为带有两个显示宽度的字符 串类型,结果为'10' ?
数据字符串的存储方式,校对规则是定义比较字符串的方式 #扩展 #字符编码:就是人类使用的英文字母、汉字、特殊符号等信息,通过转换规则,将其转换为计算机可以识别的二进制数字的一种编码方式 #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
实例收到客户端请求后,将其转换为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内部模拟了一次“错出
3.一定要保证connection字符集大于等于client字符集,不然就会信息丢失,比如: latin1 < gb2312 < gbk < utf8,若设置set character_set_client...这样MySQL就会做必要的翻译,一旦这些参数有误,自然会导致字符串在转输过程中的转换错误。基本上99%的乱码由些造成。...Db characterset: latin1 Client characterset: utf8 Conn....安装的mysql,默认client和conn为utf8编码,server和db为latin1编码,修改client和conn编码请继续下看。...socket = /var/run/mysqld/mysqld.sock 如果想修改client和conn为latin1,只需把utf8改为latin1,更多编码格式请见下面:show charset
2 检查元数据库编码 数据库显示为乱码,第一时间检查元数据库的编码,看是否是utf8编码。 ? 发现数据库编码为latin1,从而要将数据库编码修改为utf8....< character-set-server=utf8 < [client] < default-character-set=utf8 < [mysql] < default-character-set...使用sed命令替换建表语句中的字符集: [root@KEL1 mysql]# sed -i 's/CHARSET=latin1/CHARSET=utf8/g' *.sql [root@KEL1 mysql...]# sed -i 's/latin1_bin/utf8_general_ci/g' *.sql [root@KEL1 mysql]# sed -i 's/latin1/utf8/g' *.sql 检查是否替换成功...PART_COL_STATS (DB_NAME,TABLE_NAME,COLUMN_NAME,PARTITION_NAME) USING BTREE; 将表PART_COL_STAS中的PARTION_NAME的长度替换为
它把客户端传来的语句,从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将结果转换为与客户端相同的字符集传递给客户端。
u4e2d\\u56fd" print(a) \u4e2d\u56fd a.encode().decode("unicode_escape") '中国' 也可以通过repr将其转化为字符串,将两个反斜杠替换为一个反斜杠来解决这个问题...要确保LANG为utf8。...mysql编码问题 查看当前的数据库编码: mysql> show variables like 'character%'; +--------------------------+----------...服务器默认编码; ● character_set_results:MySQL会把数据转换成该编码后,再发送给客户端,例如该编码为UTF8,那么如果客户端不使用UTF8来解读,那么就会出现乱码,说明客户端必须使用...通过set names utf8 保证client、connection和result 的编码一致: mysql> show variables like 'character%'; +--------
又或者存入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编码的表中。
领取专属 10元无门槛券
手把手带您无忧上云