之前已经介绍过MySQL字符集(https://www.toutiao.com/article/7202801194354409996/)。今天再来介绍下关于字符集的一些知识点:
MySQL中的字符集有两个级别概念,分别是服务器级别和客户端级别。
1. 服务器级别
服务器字符集指的是服务器用来存储和处理数据的字符集。在MySQL中,可以在启动MySQL服务的时候指定服务器字符集,也可以在配置文件中进行设置。服务器级别的字符集设定主要影响以下内容:
- 存储字符数据时所采用的字符编码方式;
- SQL语句中的字符串常量的编码方式;
- 数据库中表、列名的编码方式。
2. 客户端级别
客户端字符集指的是客户端用来编码和解码数据的字符集。在MySQL中,客户端可以连接多个服务器,每个服务器都可以拥有不同的字符集。客户端级别的字符集设定主要影响以下内容:
- 连接服务器时采用的字符编码方式;
- SQL语句中的字符串常量的编码方式;
- 查询结果返回的字符串的编码方式。
因此,如果服务器和客户端的字符集不同,就可能导致出现乱码或数据不能正常存储和读取等问题。
在实际应用中,我们需要根据数据库设计和应用场景的需要来选择合适的字符集,并注意设置服务器和客户端的字符集,目的是确保所储存和查询的数据的正确无误。
问题解析
测试环境的数据库中有些数据库表的CHARSET=utf8,还有些是CHARSET=utf8mb4。我们期望修改数据库表的CHARSET=uft8mb4。于是执行下面语句:
alter table <表名> character set utf8mb4;
再次查看建表语句时发现,表的DEFAULT CHARSET修改成功,但是字段的CHARSET还是保留原来的utf8。如果想修改表、字段的CHARSET时,应该执行下面语句:
ALTER TABLE <表名> CONVERT TO CHARACTER SET utf8mb4;
避坑 :请大家一定要使用正确的数据库表字符集修改语句。