mysql数据库表里中文乱码应该选哪种编码?

mysql数据库表里中文乱码应该选哪种编码?,第1张

数据库中关于字符集的种类有很多,个人建议,数据库字符集尽量使用utf8(utf-8),以使你的数据能很顺利的实现迁移,因为utf8字符集是目前最适合于实现多种不同字符集之间的转换的字符集,尽管你在命令行工具上无法正确查看数据库中的内容,我依然强烈建议使用utf8作为默认字符集如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中文在命令行工具中插入数据,并且可以直接显示出来而不要使用gb2312或者gbk等字符集,如果担心查询排序等问题,可以使用binary属性约束 对编程有影响的主要是客户端字符集和数据库字符集(还有一个服务器字符集,不知道干什么用的), 数据库中常用的 *** 作就是保存数据和读取数据,在这过程中,乱不乱码和数据库字符集貌似没有什么关系。我们只要保证写入时选择的字符集和读取时选择的字符集一致,即只需保证两次 *** 作的客户端字符集一致即可。 \x0d\在MySQL的客户端上执行一次查询的过程一般是,在客户端的提示符后面输入一条SQL语句,回车,然后终端显示出查询的结果。这个过程中,只有终端和三个MySQL的系统变量指定了正确的字符集,才能保证我们将一个正确的SQL语句送到服务器,然后服务器返回正确的结果,并且在终端正确显示。 \x0d\三个MySQL的系统变量是: \x0d\1 character_set_client,终端字符集,告诉Server客户端提交的SQL语句的编码格式 \x0d\2 character_set_connection,连接字符集,是服务器翻译SQL语句时用到的编码格式 \x0d\3 character_set_results,返回的结果集的字符集,是服务器返回结果集之前把结果集转换成的编码格式 \x0d\在MySQL终端通过执行命令 show variables like ‘char%’ 可以查看这几个变量的值。这三个变量通常都设定为同一种字符集,用命令set names [charset name]就可以修改这三个变量的值。一般来说,只要你设定了能够表示你的数据的字符集,你查询的结果都可以在终端正确显示。 \x0d\举个例子,使用的表t1是utf8编码,表中的字段c1继承了这个编码,表创建如下 \x0d\mysql> create table t1 ( c1 text not null ) character set utf8; \x0d\用的字符是汉字“范”,gbk编码为B7 B6,utf8编码为E8 8C 83 \x0d\用下面的SQL语句插入数据 \x0d\mysql> insert into t1 values( ‘范’); \x0d\a)如果终端设置为utf8,并且执行了 set names utf8,那么插入到数据库中的就是“范”这个字的utf8编码,这个过程中MySQL不需要做编码转换。写入数据库的内容可以通过执行 select hex( c1 ) from t1 得到数据的十六进制编码来验证。 \x0d\\x0d\b)如果终端设置为 utf8,并且执行了set names gbk,那么执行完这个插入 *** 作后,写入的二进制数据是E9 91 BC,这是“汉字“锣”的utf8编码。这是因为,终端输入的“范”用的是utf8编码,而服务器以为终端发送过来的内容是gbk编码,所以在向t1表中插入的时候进行了一次gbk到utf8的转换,结果当然是错误的。 \x0d\\x0d\c)如果终端设置为gbk,并且执行了set names gbk,那么执行完插入 *** 作后,写入t1的依然是“范”这个字的utf8编码。插入过程中,终端输入的是“范”的gbk编码B7 B6,服务器被告知终端发过来的SQL语句是gbk编码(由character_set_client指定),所以在插入数据前做了一次gbk到utf8的编码转换。 \x0d\\x0d\d)如果终端设置为gbk,并且执行了set names utf8,那么执行完插入 *** 作后,MySQL会报出一个数据被截断的警告。实际上,输入终端的是“范”这个字符的gbk编码B7 B6,而服务器被告知客户端发过来的SQL语句是utf8编码,所以在执行过程中没有做转码,直到插入数据的时候,发现B7 B6不符合utf8的编码规则,给出了警告信息,实际插入的数据是3F 3F,也就是两个问号。 \x0d\\x0d\查询的时候是同样的道理,MySQL也是根据set names设定的字符集来对返回给客户端的结果集做相应的编码转换,如果转换的结果和终端显示的字符集一致,就能正确显示,如果不一致就是乱码。 \x0d\\x0d\结论是,只要终端的字符集和set names指定的字符集一致就可以让MySQL在处理过程中执行正确的转码并且正确地显示。 \x0d\\x0d\另外,如果通过程序 *** 作MySQL数据库, 那么也需要事先执行set names命令来指定程序希望输出的字符集。比如,用程序从一个utf8编码的数据库向另外一个gbk编码的数据库进行数据迁移,在选取源数据库数据之前,需要执行set names gbk,才能取到gbk编码的数据。

查看数据库的字符集
show variables like 'character\_set\_%';
输出:
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+--------+

理论上说起来,设置为 utf8 也并非一个完全合适、100% 没毛病的值,即便你将 MySQL 的字符集设置为 utf8 ,也有可能出现乱码!

通过以下命令,你可以查看 MySQL 所支持的所有『字符集』编码:

在显示的 Charset ,你会看见熟悉的 utf8

如果你再仔细看一下这一行,你会发现这一行的 Maxlen 列中的值居然是 3 !?

这是 MySQL 中的 utf8 并非我们现在常说的 『真·UTF8』 。它『 最多 』只用 3 个字节存储一个字符,而有些中日韩生僻字<small>(包括 emoji 表情)</small>的 Unicode 编码是需要 4 个字节宽度才能存储的,这就会导致一些乱码的隐患。

MySQL 解决这个问题的方案是绕过 utf8 提出一种新的字符集来实现 『 真·UTF8 』 功能: utf8mb4

实际上,为了统一称呼,MySQL 在提出 utf8mb4 字符集之后,就将 utf8 改为 utf8mb3 的别名,因此,你设置字符集为 utf8 本质上就是设置成了 utf8mb3

在更高版本(8x)的 mysql 中,MySQL 直接将 utf8 改为了 utfmb4 的别名。

myini或者mycnf内可以设置默认字符集例如:default-character-set=utf8
建表或改表时,语句:
create
table
`user`
(
`id`
bigint(20)
not
null,
`name`
varchar(255)
not
null,
primary
key
(`id`),
unique
key
`name`
(`name`)
)
engine=innodb
default
charset=utf8
客户端登录查询时,命令参数:mysql
-uroot
--default-character-set=utf8
-p

1 首先你要明确,unicode是字符编码,unicode编码常用的存储格式有2种:utf8、utf16
这2种的区别就是存储格式不同,但是都是unicode编码,例如,中文的"你"字的utf8格式编码为:E4 BD A0; 而utf16编码为:60 4F。 有时候,说unicode编码的时候泛指UTF16,当这是不严谨的说法。
与unicode编码格式相对应的是内码,例如,中文的"你"字的内码编码为C4 E3。内码在不同语种中很多是相互重叠的,比如,用中文 *** 作系统看日文内码的文本就是乱码;而unicode编码所为有语种安排了独立的区域,没有重叠,所以用中文 *** 作系统看日文unicode没有障碍,这就是设计unicode的目的所在。
2 以utf-8保存,当然要用同样的编码格式进行解码
3 mysql中通过show variables like 'character%'出现的信息是指明mysql各模块默认使用的字符编码格式
4 url中设定的useUnicode=true&characterEncoding=UTF-8表示你用sql语句存储的数据和查询出来的数据都用utf-8格式


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13371266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-23
下一篇 2023-07-23

发表评论

登录后才能评论

评论列表(0条)

保存