一、字符集(Character Sets)
-
字符集(Character Sets):定义了字符以及字符的编码。
-
字符序(Collations):定义了字符的比较规则,又名排序规则。
-
Unicode(The Unicode Standard):其官方机构Unicode联盟所用的中文名称为统一码,又译作万国码。这里只是一个标准。其实现有
-
UTF-8
:1~4个字节(bytes)表示一个符号(character)。-- 使用最广 -
UTF-16
:每个字符用两个字节或四个字节表示。 -
UTF-32
:每个字符用四个字节表示。
-
MySQL 提供服务器(Server)、数据库(Database)、表(Table)、列(Column)等级别修改不同的数据集,默认使用上一级别定义的数据集。
1.1 查看支持的数据集
SHOW CHARACTER SET;
-- 或者
SELECT * FROM information_schema.HARACTER_SETS;
MySQL在Version 4.1开始支持utf8
,目前比较有歧义的是utf8
、utf8mb3
和utf8mb4
-
uft8mb3
:- 支持&仅且支持BMP characters(不支持supplementary characters)
- 每个multibyte-character,都不多于3个bytes
-
utf8mb4
:要想支持BMP characters + supplementary characters,既国际上的UTF-8/(4bytes)
,用uft8mb4
(见官方文档 Section 10.9.1, “The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding)”)
默认 MySQL 的 utf8
字符集为utf8mb3
(隐式命名在未来可能会变更为uft8mb4
),与其他语言对应的 utf8 其实是 utf8mb4
1.2 创建时定义为utf8mb4
CREATE TABLE xxx(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) CHARACTER SET utf8mb4,
description TEXT CHARACTER SET utf8mb4,
gmt_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1.3 修改已有库/表/列为utf8mb4
修改库(特别注意:生产环境谨慎操作,修改字符集会导致锁表!!!)
ALTER DATABASE xxxx CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
生成修改表 SQL 语句
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'xxx'
AND TABLE_TYPE = 'BASE TABLE';
生成修改列 SQL 语句
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' MODIFY ', COLUMN_NAME, ' ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'xxx'
AND COLLATION_NAME LIKE 'utf8%';
评论区