关于mysql:MySql批量修改表和表内字段的字符集和排序规则

在将测试库的新增表通过Navicat向阿里云的MySql数据库复制后,发现前端页面申请查问失败。

指标数据库的默认排序规定是utf8mb4_0900_ai_ci,已存在的表都应用了这个编码,而起源数据库的排序规定是utf8mb4_unicode_ci,新复制的表都用的是后者。

数据库进行多表关联查问时,如果两张表的字符集或者排序规定不统一,就会报错。

从Navicat里手动批改编码效率很低,若只是改一下表,也用不了多久,但问题是只改表是不行的,表内所有varchar的编码并不会跟着表走。

因而还是须要走批量操作的路子。

批量批改字段

SELECT
    CONCAT(
        'ALTER TABLE `',
        TABLE_NAME,
        '` MODIFY `',
        COLUMN_NAME,
        '` ',
        DATA_TYPE,
        '(',
        CHARACTER_MAXIMUM_LENGTH,
        ') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci',
        ( CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END ),
        ';' 
) 
FROM
    information_schema.COLUMNS 
WHERE
    TABLE_SCHEMA = '数据库名' 
    AND (
    DATA_TYPE = 'varchar' 
    OR DATA_TYPE = 'char')

批量批改表

SELECT
    CONCAT( 'ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' ) 
FROM
    information_schema.TABLES 
WHERE
    TABLE_SCHEMA = '数据库名';

将以上SQL语句中的utf8mb4utf8mb4_unicode_ci数据库名别离改成本人须要的值,胜利执行后,将执行后果即SQL语句复制进去,再执行这些SQL语句即可。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理