mysql 字符集问题

问题:windows 系统下使用 mysql 5.x,插入数据有中文时候出现乱码

分析:

一,SHOW VARIABLES LIKE ‘character%’; 查看 mysql 相关字符集:

– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集
– 还有以collation_开头的同上面对应的变量,用来描述字符序。

二,mysql 中字符集的转换过程为:

  1. MySQL Server收到请求时将请求数据从 character_set_client 转换为 character_set_connection;

  2. 进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集,其确定方法如下:

    - 使用每个数据字段的 CHARACTER SET 设定值;
    - 若上述值不存在,则使用对应数据表的 DEFAULT CHARACTER SET 设定值 ( MySQL 扩展,非 SQL 标准);
    - 若上述值不存在,则使用对应数据库的 DEFAULT CHARACTER SET 设定值;
    - 若上述值不存在,则使用 character_set_server 设定值。
    
  3. 将操作结果从内部操作字符集转换为 character_set_results。

三,问题所在

我们现在回过头来分析下我们产生的乱码问题:

我们的字段没有设置字符集,因此使用表的数据集,我们的表没有指定字符集,默认使用数据库存的字符集,我们的数据库在创建的时候没有指定字符集,因此使用 character_set_server 设定值,我们没有特意去修改 character_set_server 的指定字符集,因此使用 mysql 默认,mysql 默认的字符集是 latin1,因此,我们使用了latin1 字符集,而我们 character_set_connection 的字符集是 UTF-8,插入中文乱码也再所难免了。

解决方法:

windows 下 mysql5.x 的配置文件在这个路径下:C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

修改配置文件下字符集配置参数:

1
2
default-character-set = utf8
character_set_server = utf8

然后重启 mysql 服务。

关于 mysql 字符集问题,mysql 在 5.5.3 之后增加了这个 utf8mb4 的编码,mb4 就是 most bytes 4 的意思,专门用来兼容四字节的 unicode 。好在 utf8mb4 是 utf8 的超集,除了将编码改为 utf8mb4 外不需要做其他转换。当然,为了节省空间,一般情况下使用 utf8 也就够了。

参考:

1,https://www.cnblogs.com/discuss/articles/1862248.html

2,https://www.jianshu.com/p/f4a564179107

3,https://blog.csdn.net/gywtzh0889/article/details/59528902