• Mysql 字符集修改方案及说明


    说明
    • 文章内容适用于 Mysql5.7、Mysql 8.0,其它版本可自行验证。

    • 数据库、表、字段的字符集排序规则修改为:utf8mb4utf8mb4_general_ci

    • Mysql表中字符类型的字段长度为支持的字符个数,修改字符集不需要增加字段长度。

    • 经验证,字符集的变更不需要重新创建索引。

    1.若库的字符集需修改:

      整理留存相关库原字符集SQL,以备回滚使用:

    ALTER DATABASE [库名] CHARACTER SET [原字符集] COLLATE [原排序规则];
    
    • 1

      执行以下SQL修改指定库的字符集:

    ALTER DATABASE [库名] CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    
    • 1
    2.执行以下SQL并记录表原字符集SQL表需修改字符集SQL
    SELECT
    	DISTINCT
    	table_schema,
    	table_name,
    	character_set_name,
    	collation_name,
    	CONCAT('ALTER TABLE ', table_schema, '.', table_name, ' CONVERT TO CHARACTER SET \'', character_set_name, '\' COLLATE \'', collation_name, '\';') '表原字符集SQL',
    	CONCAT('ALTER TABLE ', table_schema, '.', table_name, ' CONVERT TO CHARACTER SET \'utf8mb4\' COLLATE \'utf8mb4_general_ci\';') '表需修改字符集SQL'
    FROM
    	information_schema.COLUMNS 
    WHERE TABLE_SCHEMA NOT IN ('mysql','performance_schema','sys','information_schema','mysql_ha','mysql_db_monitor')
    	AND COLLATION_NAME IS NOT NULL 
    	AND COLLATION_NAME != 'utf8mb4_general_ci';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注:

    1. 表原字符集SQL用于回滚备份。
    2. 表需修改字符集SQL用于执行表整体字符集修改。
    3.执行以下SQL并记录字段原字符集SQL
    SELECT
    	TABLE_SCHEMA '数据库',
    	TABLE_NAME '表',
    	COLUMN_NAME '字段',
    	CHARACTER_SET_NAME '原字符集',
    	COLLATION_NAME '原排序规则',
    	CONCAT(
    		'ALTER TABLE ',
    		TABLE_SCHEMA, '.', TABLE_NAME,
    		' MODIFY COLUMN ',
    		COLUMN_NAME,
    		' ',
    		COLUMN_TYPE,
    		' CHARACTER SET ', CHARACTER_SET_NAME, ' COLLATE ', COLLATION_NAME, 
    		( CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END ),
    		( CASE WHEN COLUMN_COMMENT = '' THEN ' ' ELSE concat( ' COMMENT''', COLUMN_COMMENT, '''' ) END ),
    		';' 
    	) '字段原字符集SQL',
    	CONCAT(
    		'ALTER TABLE ',
    		TABLE_SCHEMA, '.', TABLE_NAME,
    		' MODIFY COLUMN ',
    		COLUMN_NAME,
    		' ',
    		COLUMN_TYPE,
    		' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci',
    		( CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END ),
    		( CASE WHEN COLUMN_COMMENT = '' THEN ' ' ELSE concat( ' COMMENT''', COLUMN_COMMENT, '''' ) END ),
    		';' 
    	) '字段需修正字符集SQL' 
    FROM information_schema.`COLUMNS` 
    	WHERE 1=1
    	AND COLLATION_NAME != 'utf8mb4_general_ci'
    	AND TABLE_SCHEMA NOT IN ('mysql','performance_schema','sys','information_schema','mysql_ha','mysql_db_monitor');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    注: 字段原字符集SQL用于回滚备份。

    4.执行修正SQL

      逐条执行第2步中获取的表需修改字符集SQL

      执行失败情况处理:

    • 外键原因:需先关闭外键约束,全部执行完成后再打开外键约束。
    -- 关闭外键约束
    SET FOREIGN_KEY_CHECKS=0;
    
    -- 打开外键约束
    SET FOREIGN_KEY_CHECKS=1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 表字段过长:需酌情减短相关字段的长度。
    5.若需回滚原字符集,则按以下步骤进行

      a. 执行第1步中备份的相关库原字符集SQL

      b. 执行第2步中备份的表原字符集SQL

      c. 执行第3步中备份的字段原字符集SQL

  • 相关阅读:
    Find the Maximum - 题解【思维,贪心】
    解读 | 面向点云车辆检测的三维全卷积网络
    圣诞旺季来临,流量突破30亿!赛盈分销双重福利加码,助力卖家抢夺旺季流量,爆单不费力!
    两台linux虚拟机之间实现免密登录
    Rebex Total Pack 6.0 for .Net Crack
    负载均衡算法实现
    顺序表与链表(上)
    react-navigation学习
    c++ Qt 网络连接
    获取wifi密码信息(仅供学习使用,勿作他用)
  • 原文地址:https://blog.csdn.net/Qiwan2/article/details/133177403