本文主要介绍RDS MySQL字符集的相关信息。
阿里云提醒您:
- 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
- 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
- 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
本文主要从以下几个方面介绍字符集:
以字符序对应的字符集名称开头,以_ci(不区分大小写)、_cs(区分大小写)、_bin(按编码值比较,区分大小写)结尾。例如:当会话的collation_connction设置为utf8_general_ci字符序时,字符a和字符A是等价的,而当其设置为utf8_bin时,字符a和字符A是不等价的。具体信息请参考以下示例。
use [$DB_Name];
show variables like '%character%';
说明:[$DB_Name]为数据库名。系统显示类似如下。
说明:
- 以上参数必须保证除了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_system参数在控制台上暂时不提供更改,但是由于其优先级最低,因此影响不大。修改了客户端字符集、character_set_database、character_set_server之后基本上可以保证不会出现乱码,在代码中设置客户端字符编码时建议通过
set names [$Character_Set]
SQL语句来修改客户端的设置。
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; #修改表字符集和字符序
示例如下图所示。
修改参数character_set_server需要重启实例,建议在业务低峰期进行操作。
提示:该参数修改后,仅对开启高权限账号的实例后来创建的数据库有效,对当前数据库无效。
修改列时,当前列中的所有行都会立即转化为新的字符集。alter table
会对表加元数据锁(metadata lock), 详情请参见RDS MySQL表上Metadata lock的产生和处理。
语法如下所示:
ALTER DATABASE [$Database] CHARACTER SET [$Character_Set] COLLATE [$Collation_Name];
。
说明:
- [$Database]为数据库的库名。
- [$Character_Set]为字符集名称。
- [$Collation_Name]为排序规则名称。
ALTER TABLE [$Table] CONVERT TO CHARACTER SET [$Character_Set] COLLATE [$Collation_Name];
。
说明:[$Table]为表名。
ALTER TABLE [$Table] MODIFY [$Column_Name] [$Field_Type] CHARACTER SET [$Character_Set] COLLATE [$Collation_Name];
。
说明:
- [$Column_Name]为字段名。
- [$Field_Type]为字段类型。
如下SQL语句所示,分别将库dbsdq、tt2表、tt2表中的c2列修改为utf8mb4字符集。
alter database dbsdq character set utf8mb4 collate utf8mb4_unicode_ci; use dbsdq; alter table tt2 convert to character set utf8mb4 collate utf8mb4_unicode_ci; alter table tt2 modify c2 varchar(10) character set utf8mb4 collate utf8mb4_unicode_ci;
主要介绍RDS MySQL如何使用utf8mb4字符集存储emoji表情。
如果要实现存储emoji表情到RDS MySQL实例,需要客户端、应用到RDS实例的连接、RDS实例内部三个方面统一使用或者支持utf8mb4字符集。
对于JDBC连接串设置了characterEncoding为utf8,或者做了上述配置仍旧无法正常插入emoji数据的情况,建议在代码中指定连接的字符集为utf8mb4,示例代码如下。
String query = "set names utf8mb4"; stat.execute(query);
在文档使用中是否遇到以下问题
更多建议
匿名提交