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 = '数据库表名';

 

posted @ 2024-01-29 09:31  ToDarcy  阅读(166)  评论(0编辑  收藏  举报