2023.03.13 Mysql 修改表和字段的字符集

2023-03-12  本文已影响0人  薛定谔的猴子

如果你想将 mysql 的所有表,以及表的所有字段,都统一改为 utf8mb4_general_ci,你可以参考以下步骤:

一、单表操作

ALTER DATABASE db_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8mb4COLLATEutf8mb4_general_ci;
ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

注意,这些操作会在字符集中转换列值,如果原来的列值使用的是不兼容的字符集,那么可能会导致数据损坏或乱码。所以,在执行这些操作之前,请务必备份好数据库。

二、批量操作

如果你想批量修改多个表和字段的字符集,你可以利用 information_schema 库中的元数据信息来生成相应的 SQL 语句。例如,如果你想批量修改数据库 db_name 中所有表和字段的字符集为 utf8mb4,并指定排序规则为 utf8mb4_general_ci,你可以使用以下语句:

-- 批量修改所有表的默认字符集
SELECT CONCAT('ALTER TABLE ', table_name, ' DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') AS _sql FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = 'db_name';

-- 批量修改所有字段的字符集
SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', data_type, '(', character_maximum_length, ') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci', (CASE WHEN is_nullable = 'NO' THEN ' NOT NULL' ELSE '' END), ';') AS _sql FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = 'db_name';

需要注意,批量修改所有字段的字符集,有些结果是空,原因有以下几种:

如果上述三种情况的条件和判断都加入到一个语句中,如下:

SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', data_type, CASE WHEN data_type IN ('text','blob') THEN '' ELSE CONCAT('(', character_maximum_length ,')') END ,  'CHARACTER SET utf8mb4COLLATE utf8mb4_general_ci ', (CASE WHEN is_nullable = 'NO' THEN ' NOT NULL' ELSE '' END), ';') AS _sql FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = 'db_name' AND character_maximum_length IS NOT NULL AND character_set_name <> 'utf8mb4' AND collation_name <> 'utf8mb4_general_ci';

执行后得到的就是修改数据库中所有表和字段字符集的语句,然后复制这些语句执行就可以了。

上一篇下一篇

猜你喜欢

热点阅读