mysql字符编码以及字符序
1、数据库中有关编码格式的配置
查看数据库有关编码格式的配置
mysql> show variables like 'char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /paic/mysql/base/share/charsets/ |
+--------------------------+----------------------------------+
可以看到一共8个变量:
character_set_client
主要用来设置客户端使用的字符集。
character_set_connection
主要用来设置连接数据库时的字符集,如果程序中没有指明连接数据库使用的字符集类型则按照这个字符集设置。
character_set_database
主要用来设置默认创建数据库的编码格式,如果在创建数据库时没有设置编码格式,就按照这个格式设置。
character_set_filesystem
文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的。
character_set_results
数据库给客户端返回时使用的编码格式,如果没有指明,使用服务器默认的编码格式。
character_set_server
服务器安装时指定的默认编码格式,这个变量建议由系统自己管理,不要人为定义。
character_set_system
数据库系统使用的编码格式,这个值一直是utf8,不需要设置,它是为存储系统元数据的编码格式。
character_sets_dir
这个变量是字符集安装的目录。
2、客户端设置
其中 character_set_client、character_set_connection 以及 character_set_results 三个变量是客户端每次连接数据库时想要的字符编码,和服务端没有关系。登录mysql后,执行 set names gbk; 实际上就是同时修改的这三个参数。
修改上边三个变量登录mysql设置:
mysql> set names latin1;
查看变化
mysql> show variables like 'char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /paic/mysql/base/share/charsets/ |
+--------------------------+----------------------------------+
也可以修改配置文件,在 [mysql] 段添加:
default-character-set=latin1
3、服务端设置
character_set_database 是单个数据库级别的 字符集设置,该参数允许不同的 database 使用不同的字符集。
比如:
create database test1 character set utf8mb4 collate utf8mb4_bin;
这个语句创建了数据库 test1 ,同时设置了该库的 character 和 collate 参数。
character_set_server 设置的是 server 级别的也就是配置文件中 [mysqld] 段的字符集,同一个 mysqld 的配置,所有字符存储时使用相同的字符集。
字符集默认是 lantin1,通常的配置还有 utf8、utf8_bin、gbk 等。
character_set_server 通常和 collation_server (也就是排序规则)一同配置。
排序规则 collation_server 的参数通常有 utf8mb4_bin、utf8mb4_general_ci、utf8_bin、utf8_general_ci。
ci 代表 casesensitive ignore 排序时不考虑大小写;_bin 结尾的排序时考虑大小写。
4、编码格式
latin1:mysql默认的编码格式,是单字节编码,所以因为字节的原因,有些国家的语言不能使用 latin1 显示。
gbk:GBK是国家标准,包含全部中文字符,不论中英文都采用双字节编码。如果数据库大量存储汉字,对性能要求高,就应该选择 GBK 编码方式。因为存储汉字的话,GBK每个汉字只占用2个字节,UTF8 汉字编码需要3个字节,GBK 比 UTF8 所占空间小,还可以减少磁盘I/O,数据库cache,以及网络传输时间(现在可忽略不计)从而提高性能。
GBK是定长字符集,UTF8 是变长字符集,如果数据库需要做大量的字符运算、比较、排序等等,选择定长字符集会更好,因为定长字符集处理速度要比变长字符集处理速度快。
utf8: UTF8 是 Unicode 字符集,是 UTF16 改良版本,1至4字节编码规范。国际流行通用使用此编码,如果你的网站是多国语言就首选这个字符集。
如果数据库主要处理英文,则建议采用 UTF-8,因为GBK对英文字符编码也采用2个字节,而 UTF8 只需要一个字节。
如果客户有外国的,建议用UTF8,因为国外客户访问GBK的页面要下载语言包,访问 UTF-8 编码的网页则不出现这问题,UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。
utf8mb4:MySQL在5.5.3之后增加了这个 utf8mb4 的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的 unicode。好在utf8mb4是utf8的超集,除了将编码改为 utf8mb4 外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
因为 utf8 编码最大字符长度为3字节,如果遇到4字节的宽字符就会插入异常了。例如Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等。
为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8。 对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。
5、举例
下面举个 mysql 的字符集配置案例:
vi /etc/my.cnf
[client] 中添加
default-character-set = utf8mb4
[mysqld] 中修改
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
character-set-client-handshake = FALSE
[mysql] 中添加
default-character-set = utf8mb4
[client] 代表客户端默认设置内容
[mysql] 代表我们使用mysql命令登录mysql数据库时的默认设置
[mysqld] 代表数据库自身的默认设置
6、出现乱码分析
编码格式如果要设置为UTF8
6.1、检查服务器端(也就是 [mysqld] 段)配置是否为 UTF8。
6.2、检查客户端(也就是 [client] 和 [mysql] 段)配置是否为 UTF8。
6.3、检查ssh工具(例如 SecureCRT )会话选项的配置是否为 UTF8。
6.4、检查linux系统默认编码格式是否为UTF8
参考:
https://www.cnblogs.com/digdeep/p/5228199.html
https://blog.csdn.net/sun8112133/article/details/79921734
https://www.cnblogs.com/beyang/p/7580814.html
https://www.cnblogs.com/zeroingToOne/p/9536888.html
https://www.cnblogs.com/shihaiming/p/5855616.html