1. utf8mb3 是一种字符集 (charset)
  2. utf8mb4_unicode_ci 是一种排序规则 (collation),它基于 utf8mb4 字符集

让我详细解释一下:

UTF8MB3 vs UTF8MB4

UTF8MB3

  • MySQL中传统的”UTF-8”实现(在MySQL中称为 utf8,现在别名为 utf8mb3
  • 每个字符最多使用3个字节
  • 只能存储基本的Unicode字符
  • 不支持emoji、某些特殊符号和较新的Unicode字符

UTF8MB4

  • 完整的UTF-8实现
  • 每个字符最多使用4个字节
  • 支持完整的Unicode字符集
  • 支持emoji、表情符号、特殊符号等

要将整个数据库及其所有表和列的字符集修改为 utf8mb4_unicode_ci,您需要按以下步骤操作:

1. 修改数据库字符集

  1. ALTER DATABASE your_database_name
  2. CHARACTER SET utf8mb4
  3. COLLATE utf8mb4_unicode_ci;

2. 修改所有表的字符集

首先查询数据库中的所有表,然后逐一修改:

  1. -- 查看数据库中的所有表
  2. SHOW TABLES;
  3. -- 对每个表执行以下命令
  4. ALTER TABLE table_name
  5. CONVERT TO CHARACTER SET utf8mb4
  6. COLLATE utf8mb4_unicode_ci;

3. 一键修改所有表(使用脚本)【实用-推荐】

您可以使用以下SQL脚本来生成修改所有表的语句:

  1. SELECT CONCAT('ALTER TABLE ', table_name,
  2. ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') AS alter_statement
  3. FROM information_schema.tables
  4. WHERE table_schema = 'your_database_name';

复制查询结果中生成的每条ALTER TABLE语句,逐一执行。

4. 修改现有列的字符集

如果某些列有特定的字符集设置,还需要单独修改:

  1. -- 查找所有字符类型的列
  2. SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ',
  3. data_type, '(', character_maximum_length, ') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci',
  4. CASE WHEN is_nullable = 'NO' THEN ' NOT NULL' ELSE '' END, ';') AS alter_column_statement
  5. FROM information_schema.columns
  6. WHERE table_schema = 'your_database_name'
  7. AND data_type IN ('varchar', 'char', 'text', 'tinytext', 'mediumtext', 'longtext');

5. 验证修改结果

  1. -- 检查数据库字符集
  2. SELECT default_character_set_name, default_collation_name
  3. FROM information_schema.schemata
  4. WHERE schema_name = 'your_database_name';
  5. -- 检查表字符集
  6. SELECT table_name, table_collation
  7. FROM information_schema.tables
  8. WHERE table_schema = 'your_database_name';
  9. -- 检查列字符集
  10. SELECT table_name, column_name, character_set_name, collation_name
  11. FROM information_schema.columns
  12. WHERE table_schema = 'your_database_name'
  13. AND data_type IN ('varchar', 'char', 'text', 'tinytext', 'mediumtext', 'longtext');