字符序命名规则
以字符序对应的字符集名称开头,以 _ci(大小写不敏感)、_cs(大小写敏感)、_bin(按编码值比较,大小写敏感)结尾。
例如:当会话的collation_connection设置为字符序utf8_general_ci时,字符a和字符A是等价的;而当其设置为utf8_bin 时,字符a和字符A是不等价的。
请参考以下示例:
(xxx.mysql.rds.aliyuncs.com) [xxx]> show variables like 'coll%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
(xxx.mysql.rds.aliyuncs.com) [xxx]> select count(*) from t where 'a' = 'A';
+----------+
| count(*) |
+----------+
| 16 |
+----------+
1 row in set (0.00 sec)
(xxx.mysql.rds.aliyuncs.com) [xxx]> set collation_connection='utf8_bin';
Query OK, 0 rows affected (0.00 sec)
(xxx.mysql.rds.aliyuncs.com) [xxx]> show variables like 'coll%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8_bin |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
(xxx.mysql.rds.aliyuncs.com) [xxx]> select count(*) from t where 'a' = 'A';
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
字符集相关 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; #修改表字符集和字符序
示例:执行 show create database 命令后,输出结果中 DEFAULT CHARACTER SET utf8 表示该数据库的默认字符集为 utf8。
mysql> show create database xxx;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| xxx | CREATE DATABASE xxx /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)
控制台修改字符集参数(character_set_server)的方法
修改参数character_set_server需要重启实例,建议在业务低峰期进行操作。
操作步骤
-
登录RDS管理控制台。
-
在页面左上角,选择实例所在地域。
-
找到目标实例,单击实例ID。
-
在左侧导航栏中单击参数设置。
-
在可修改参数页签下查找到character_set_server,单击右侧
进行修改并单击确定。找到 character_set_server 参数,单击其右侧的编辑图标,将参数值修改为目标字符集(如 utf8)。 -
在右上角单击提交参数,在弹出的对话框中单击确定,等待实例重启。
说明该参数修改后,仅对开启高权限账号的实例后来创建的数据库有效,对当前数据库无效。
使用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 convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table tt2 modify c2 varchar(10) character set utf8mb4 collate utf8mb4_unicode_ci;
-
修改列时,当前列中的所有行都会立即转化为新的字符集。
-
alter table会对表加元数据锁(metadata lock)。
-
如果需要指定字符集,则需要单独修改,否则会跟随默认设置的全局服务器级别字符集。字符集的设置有四级:服务器级、数据库级、表级、字段级。前三种均为默认设置,建议用
SHOW CREATE TABLE tableName;或SHOW FULL FIELDS FROM tableName;来检查当前表中字段的字符集设置。