MySQL批量修改数据表编码及字符集为utf8mb4
utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。
更改数据库的编码为utf8mb4:
1. MySQL的版本
utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本。
2. MySQL驱动
utf8mb4编码最低版本是5.1.34可用,低于5.1.13版本不能使用
3.查看配置
注:建议直接使命令连接数据库,最好不要使Navicat等具连接,不然查出的结果不准确。
SHOW VARIABLES WHERE VARIABLE_NAME LIKE 'character_set_%' OR VARIABLE_NAME LIKE 'collation%';
通过以上命令查看变量值,查询结果如下
通过结果,虽然collation_connection 、collation_database 、collation_server是什么没关系。
但必须保证以下几个变量必须是utf8mb4。
character_set_client (客户端来源数据使用的字符集)
character_set_connection (连接层字符集)
character_set_database (当前选中数据库的默认字符集)
character_set_results (查询结果字符集)
character_set_server (默认的内部操作字符集)
4.修改MySQL配置文件
修改mysql配置文件my.cnf(windows 是 my.ini),找到后请在以下三部分里添加如下内容:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_bin init_connect='SET NAMES utf8mb4'
配置完成之后,重启数据库,检查变量,再次执行命令,可以看到变量值已修改
SHOW VARIABLES WHERE VARIABLE_NAME LIKE 'character_set_%' OR VARIABLE_NAME LIKE 'collation%';
5. 数据库连接的配置
数据库连接参数中:
characterEncoding=utf8会被自动识别为utf8mb4,也可以不加这个参数,会自动检测。
而autoReconnect=true是必须加上的。
6. 将数据库和已经建好的表也转换成utf8mb4
6.1 修改数据库编码
ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
6.2 修改表编码
执行以下的SQL,把数据库名改为自己的数据库名称,执行后的结果集就是修改编码和字符集的SQL, 然后复制出来,批量执行就好了。
SELECT CONCAT("ALTER TABLE `", TABLE_NAME,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;") AS target_tables FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="数据库表名" AND TABLE_TYPE="BASE TABLE"
警告:数据库中数据量比较大时,不建议这样做,因为会很卡。
6.3 修改列的编码
执行以下的SQL,把数据库名改为自己的数据库名称,执行后的结果集就是修改列编码和字符集的SQL, 然后复制出来,批量执行就好了。
SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA, "`.`", TABLE_NAME, "` MODIFY COLUMN ", COLUMN_NAME, " ", COLUMN_TYPE, " CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;") AS target_tables FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA="数据库表名" AND CHARACTER_SET_NAME IS NOT NULL;
警告:数据库中数据量比较大时,不建议这样做,因为会很卡。
6.4 生成外键
SELECT concat("ALTER TABLE ",TABLE_NAME, " ADD CONSTRAINT ", CONSTRAINT_NAME," FOREIGN KEY (", COLUMN_NAME,") REFERENCES ", REFERENCED_TABLE_NAME,"(", REFERENCED_COLUMN_NAME, "); ") AS target_tables FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '数据库表名';
6.5 删除外键
SELECT concat("ALTER TABLE ",TABLE_NAME, " DROP FOREIGN KEY ", CONSTRAINT_NAME, "; ") AS target_tables FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_SCHEMA = '数据库表名';
https://blog.csdn.net/weixin_39229385/article/details/120237171
作者:IT民工郑小江
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。