rds mysql client_RDS MySQL字符集相关说明

概述

本文主要介绍RDS MySQL字符集的相关信息。

详细信息

阿里云提醒您:

如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

本文主要从以下几个方面介绍字符集:

字符序命名规则

以字符序对应的字符集名称开头,以_ci(不区分大小写)、_cs(区分大小写)、_bin(按编码值比较,区分大小写)结尾。例如:当会话的collation_connction设置为utf8_general_ci字符序时,字符a和字符A是等价的,而当其设置为utf8_bin时,字符a和字符A是不等价的。具体信息请参考以下示例。

bf97b6bf04d4be7db440c7351d6544bd.png

字符编码的介绍

登录RDS实例,请参见连接MySQL实例。

依次执行以下SQL语句,查看相应数据库的字符集。

use [$DB_Name];

show variables like '%character%';

说明:[$DB_Name]为数据库名。

系统显示类似如下。

6eb9824fa4878390425db580744cc384.png

说明:

以上参数必须保证除了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语句来修改客户端的设置。

字符集相关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;   #修改表字符集和字符序

示例如下图所示。

9a31cf9092fa064af9e93dd6665c1734.png

控制台修改字符集参数(character_set_server)的方法

注意事项

修改参数character_set_server需要重启实例,建议在业务低峰期进行操作。

操作步骤

登录RDS管理控制台。

在页面左上角,选择实例所在地域。

b707b47ccc2b7d58b70e42f8c20079b1.png

找到目标实例,单击实例ID。在左侧导航栏中单击 参数设置。

在可修改参数页签下查找到character_set_server,单击右侧按钮进行修改,并单击 确定。

f62ced7e6a152eb3cea60dcacf4c4f01.png

在右上角单击 提交参数,在弹出的对话框中单击 确定,等待实例重启。

提示:该参数修改后,仅对开启高权限账号的实例后来创建的数据库有效,对当前数据库无效。

使用SQL语句修改数据库字符集的方法

修改列时,当前列中的所有行都会立即转化为新的字符集。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;

使用Navicat修改数据库字符集的方法

修改库:使用Navicat连接数据库,选择连接的名称,右键单击库的名称,单击 编辑数据库,在字符集右侧选择需要的字符集,单击 确认 即可。

4aa28da829a33c52df1c527edc3b72aa.png

修改表:右键单击对应的表,单击 设计表,然后单击 选项,在字符集右侧选择需要的字符集,单击 保存 即可。

8dfa932f9c476e73b21ca37591eb6c50.png

修改字段:单击 字段,选择对应的字段,选择需要的字符集,单击 保存 即可。

8cf56d3c916898a848f450ee108d3632.png

示例

主要介绍RDS MySQL如何使用utf8mb4字符集存储emoji表情。

如果要实现存储emoji表情到RDS MySQL实例,需要客户端、应用到RDS实例的连接、RDS实例内部三个方面统一使用或者支持utf8mb4字符集。

客户端:客户端需要保证输出的字符串的字符集为utf8mb4。

应用到RDS实例的连接:支持utf8mb4字符集。以常见的JDBC连接为例,需要使用MySQL Connector/J 5.1.13及以上的版本,JDBC的连接串中,建议不配置characterEncoding选项。

RDS实例配置:控制台设置参数character_set_server为utf8mb4、数据库的字符集为utf8mb4,以及表的字符集为utf8mb4。

620df6eb696b82ea798c3cd099a93484.png

bb2a769eb6a9ed51e4ea59981834ebd7.png

08e2dcd7c79c62038e2e5b8593d67d59.png

更多信息

对于JDBC连接串设置了characterEncoding为utf8,或者做了上述配置仍旧无法正常插入emoji数据的情况,建议在代码中指定连接的字符集为utf8mb4,示例代码如下。

String query = "set names utf8mb4";

stat.execute(query);

适用于

云数据库RDS MySQL版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值