几个重要的术语和概念:
- 编码:某个字符集成员的内部表示
- 字符集: 字母符号的集合
- 排序规则:规定字符如何比较的指令(也叫校验规则)
- 不指定时,默认库会继承实例/表会继承库/字段会继承表的字符集和校验规则
命令积累(查看):
查看当前实例使用的字符集和校验规则(创建库不指定时使用此默认值):
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
查看当前实例支持的字符集和校验规则:
show charset;
show collation;
查看数据库编码(包括字符集和校验规则):
SHOW CREATE DATABASE db_name;
查看表编码(包括字符集和校验规则):
SHOW CREATE TABLE tbl_name;
方式二:只查看表的校验规则(5.7以上不支持)
show table status from db_name like tbl_name;
查看表中所有字段的编码(包括校验规则Collation):
SHOW FULL COLUMNS FROM tbl_name;
命令积累(修改):
修改数据库字符集:
ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE …];
[ ]代表可写可不写
如:ALTER DATABASE db_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
修改库的字符集不会对已存在表产生影响,只会对新创建未指定字符集的表赋予默认字符集
修改表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)的字符集改为新的字符集:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE …]
如:alter table tbl_name convert to character set utf8mb4 collate utf8mb4_general_ci;
如果省略collate的指定
alter table tbl_name convert to character set utf8mb4;
不写collate utf8mb4_general_ci代表collate utf8mb4;
COLLATE是改校验规则(也叫排序规则) CHARACTER SET是改字符集
注意:
上述操作是在字符集中转换列值。如果某个字符列存储的值使用的是其它的一些不兼容的字符集,那么该操作将不会得到期望的结果。在这种情况下,用户必须再对单独的字段(字符列)操作
只修改表的默认字符集而不改变已存在字符列(CHAR,VARCHAR,TEXT)的字符集:
ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE …];
如:ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
只修改表和所有字符列的校验规则(不改字符集,校验规则得改成当前字符集有的) :
ALTER TABLE tbl_name COLLATE=…;
如: alter tbl_name collate=utf8mb4_general_ci ;
修改单个字段(字符列)的字符集:
ALTER TABLE tbl_name CHANGE c_name1 c_name2 CHARACTER SET character_name [COLLATE …];
如:ALTER TABLE tbl_name CHANGE title1 title2 CHARACTER SET utf8 COLLATE utf8_general_ci;