RDS For MySQL 字符集相关说明
https://help.aliyun.com/knowledge_detail/41706.html?spm=5176.7841698.2.9.F5YjI5
- 字符序命名规则
- 字符集相关 MySQL 命令
- 控制台修改字符集参数 ( character_set_server ) 的方法
- 使用 sql 语句修改数据库字符集的方法
- 如何保证数据库字符集编码正确设置
1. 字符序命名规则
以字符序对应的字符集名称开头,以 _ci(大小写不敏感)、_cs(大小写敏感)、_bin(按编码值比较,大小写敏感)结尾。
例如:当会话的 collation_connction 设置为字符序 utf8_general_ci 时,字符 a 和字符 A 是等价的;
而当其设置为 utf8_bin 时,字符 a 和字符 A 是不等价的。
请参考以下示例:
2. 字符集相关 MySQL 命令
show global variables like '%char%'; #查看RDS实例字符集相关参数设置
show global variables like 'coll%'; #查看当前会话字符序相关参数设置
show character set; #查看实例支持的字符集
show collation; #查看实例支持的字符序
show create table table_name \G #查看表字符集设置
show create database database_name \G #查看数据库字符集设置
show create procedure procedure_name \G #查看存储过程字符集设置
show procedure status \G #查看存储过程字符集设置
alter database db_name default charset utf8; #修改数据库的字符集
create database db_name character set utf8; #创建数据库时指定字符集
alter table tab_name default charset utf8 collate utf8_general_ci; #修改表字符集和字符序
示例如图:
3. 控制台修改字符集参数(character_set_server)的方法:
在 RDS 实例控制台 参数设置 , 点击"笔" 样图标, 如图:
"确定" "提交参数" 即可, 如图:
注: 该参数修改后, 仅对开启高权限账号的实例后来创建的数据库有效. 对当前数据库无效.
4. 使用 sql 语句修改数据库字符集的方法:
语法如下:
修改库:
ALTER DATABASE 库名 CHARACTER SET 字符集名称 COLLATE 排序规则名称;
修改表:
ALTER TABLE 表名 CONVERT TO CHARACTER SET 字符集名称 COLLATE 排序规则名称;
修改一列:
ALTER TABLE 表名 MODIFY 列名 字段类型 CHARACTER SET 字符集名称 COLLATE 排序规则名称;
示例: 下面三条sql 分别将库 dbsdq , 表 tt2 , 表 tt2 中的 c2 列修改为utf8mb4 字符集, 代码如下:
alter database dbsdq character set utf8mb4 collate utf8mb4_unicode_ci;
use dbsdq;
alter table tt2 character set utf8mb4 collate utf8mb4_unicode_ci;
alter table tt2 modify c2 varchar(10) character set utf8mb4;
如图:
注意:
- 修改列时,当前列中的所有行都会立即转化为新的字符集;
- alter table 会对表加元数据锁(metadata lock), 详见:
https://help.aliyun.com/knowledge_detail/6697124.html
5. 如何保证数据库字符集编码正确设置:
在数据库中字符集是在数据库设计的过程中需要详细考虑的一点,用户需要根据您的业务场景、用户数据等方面来考虑。
- 查看数据库中设置字符集的参数
代码:
-
结果如图:show variables like '%character%';
在下面的各参数必须需要保证除了character_set_filesystem外的所有的参数都保持统一才可以保证字符编码不会出现乱码的情况。
character_set_client、character_set_connection 以及 character_set_results 这几个参数都是客户端的设置
character_set_system、character_set_server 以及 character_set_database 是指服务器端的设置。
而对于这三个服务器端的参数来说的优先级是:
列级字符集 > 表级字符集 > character_set_database > character_set_server > character_set_system
列级的字符编码在服务器端是具有最高优先级的。
- 如何能够保证我们的这些字段是一致的?
客户端字符集: 可通过如下方式来定义对应的character_set_client、character_set_connection以及character_set_results这几个参数。例如:
set names utf8;
服务器端字符集: 因设置有不同的等级,首先对于 character_set_system 暂时不提供更改,但是由于其优先级最低因此影响不大。
character_set_server的修改见上面 第 3 项 . 此处不再重复说明.
而对于character_set_database则是则是在数据库创建的时候指定的,如图:
做到上述的设置之后基本上可以保证字符编码不会出现乱码,对于在代码中设置客户端的字符编码的时候建议也可以通过 set names XXX; 来修改客户端的设置,然后再进行相关的操作。
如果问题还未能解决,请联系售后技术支持。