使用存储过程批量修改mysql库表字段的字符集和排序规则

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-16 20:24   15   0

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();

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP