mysql库的字符集和排序规则排序后对于已有的表不生效,只对新创建的表生效;
修改表的字符集和排序规则可以对字段生效。所以,只需要找出当前库所有的表,迭代修改表的即可解决问题。库的单独修改。
# 1、修改库database_name的字符集为utf8mb4,排序规则为utf8mb4_general_ci
### 连接mysql后,不用选择库,把database_name替换成目标库名字,直接执行这一句脚本。
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
# 2、创建批量修改表字符集和排序规则的存储过程
### 替换database_name为要执行的库,执行以下脚本
### 表的字符集修改utf8mb4,排序规则为utf8mb4_general_ci
use database database_name;
DROP PROCEDURE IF EXISTS UP_CHANGE_UTF8MB4;
DELIMITER $$
CREATE PROCEDURE UP_CHANGE_UTF8MB4()
COMMENT '将当前数据库中所有表的字符集和排序规则'
BEGIN
DECLARE $i INT;
DECLARE $cnt INT;
DECLARE $NAME VARCHAR(64);
#创建临时表,代替游标
DROP TABLE IF EXISTS tmp_Table_name;
CREATE TEMPORARY TABLE tmp_Table_name (
id INT NOT NULL AUTO_INCREMENT,
table_name VARCHAR(64) NOT NULL,
PRIMARY KEY (`id`)
);
# 插入要处理的表名到临时表中
INSERT INTO tmp_Table_name (table_name)
SELECT
table_name
FROM information_schema.`TABLES`
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_SCHEMA = DATABASE();
#循环处理每一张表,改表的字符集
SET $i = 1;
SELECT
COUNT(1) INTO $cnt
FROM tmp_Table_name;
WHILE $i <= $cnt DO
SELECT
table_name INTO $NAME
FROM tmp_Table_name
WHERE id = $i;
SET @asql = CONCAT('ALTER TABLE ', $NAME, ' CHARSET utf8mb4 COLLATE utf8mb4_general_ci; ');
PREPARE asql FROM @asql;
EXECUTE asql;
SET @asql = CONCAT('ALTER TABLE ', $NAME, ' CONVERT TO CHARSET utf8mb4 COLLATE utf8mb4_general_ci; ');
PREPARE asql FROM @asql;
SELECT @asql;
EXECUTE asql;
SET $i = $i + 1;
END WHILE;
DEALLOCATE PREPARE asql;
DROP TABLE tmp_Table_name;
END$$
DELIMITER ;
# 3、执行
call UP_CHANGE_UTF8MB4();
|