查看: 18|回覆: 1

MySQL批量修改字符集、排序规则(转载)

[複製鏈接]

1

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2008-8-22
發表於 2025-5-16 14:19:00 | 顯示全部樓層 |閲讀模式

版权声明:本文为CSDN韩悸桉博主原创文章

原文链接:https://blog.csdn.net/qq_38566465/article/details/140185092

 

一、查看数据库中的字符集

-- 查看数据库中的字符集
show variables where Variable_name like '%collation%'

明确要统一成哪一种字符集

 

 

二、查看某个数据库的表的用的字符集

-- 查看某个数据库的表的用的字符集
SELECT TABLE_SCHEMA '数据库',TABLE_NAME '',TABLE_COLLATION '原排序规则',CONCAT('ALTER TABLE ',TABLE_NAME, ' CHARACTER SET=utf8mb4,  COLLATE=utf8mb4_general_ci;') '修正SQL'
FROM information_schema.`TABLES` where TABLE_SCHEMA = '你的数据库名' and TABLE_COLLATION != 'utf8mb4_general_ci'

 

三、查看数据库中所有字段用的排序规则

-- 查看数据库中所有字段用的排序规则
SELECT
    TABLE_SCHEMA '数据库',
    TABLE_NAME '',
    COLUMN_NAME '字段',
    DATA_TYPE '字段类型',
    CHARACTER_SET_NAME '原字符集',
    COLLATION_NAME '原排序规则',
    COLUMN_DEFAULT '列的默认值',
    CONCAT(
    'ALTER TABLE ',
    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 ),
    ( CASE WHEN COLUMN_DEFAULT is NULL THEN ' ' ELSE concat('DEFAULT ''' , COLUMN_DEFAULT, '''') END ),
    ';' 
) '修正SQL' 
FROM
    information_schema.`COLUMNS` 
WHERE
    -- 过滤正确排序规则
    COLLATION_NAME != 'utf8mb4_general_ci'
    -- 数据库名称
    AND TABLE_SCHEMA = 'ms_db'
    -- 修改varcahr和text类型的字段
    -- AND (DATA_TYPE = 'varchar' OR DATA_TYPE = 'text' OR DATA_TYPE = 'longtext')
    

上述sql可以保证在修改字符集和排序规则时,MySQL字段默认值不做任何修改;

如果不保留字段默认值,做sql修改,会将修改过的字段的默认值删除掉,会导致java代码在配合数据库使用的时候一个代码正确性的问题。

 

上面的sql可以根据自己的情况,增加where条件筛选需要操作的表。修改sql可以直接批量复制后运行,以防万一执行前请先备份相关数据

四、修改数据库的字符集及排序规则

ALTER DATABASE `shtp_sunhouse` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';

存储字符集
utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8 字符,也就是 Unicode 中的基本多文本平面。
要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持。
为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8. 对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。
一般现在新建数据库都是使用8.0以上的,都使用utf8mb4即可。

排序字符集
utf8mb4_unicode_ci 和 utf8mb4_general_ci
1、准确性

  • utf8mb4_unicode_ci 是基于标准的 Unicode 来排序和比较,能够在各种语言之间精确排序
  • utf8mb4_general_ci 没有实现 Unicode 排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。

2、性能

  • utf8mb4_general_ci 在比较和排序的时候更快
  • utf8mb4_unicode_ci 在特殊情况下,Unicode 排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。

utf8mb4_0900_ai_ci
推荐用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也没啥问题。

MySQL 8.0 默认的是 utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种,具体含义如下:

uft8mb4 表示用 UTF-8 编码方案,每个字符最多占 4 个字节。
0900 指的是 Unicode 校对算法版本。(Unicode 归类算法是用于比较符合 Unicode 标准要求的两个 Unicode
字符串的方法)。
ai 指的是口音不敏感。也就是说,排序时 e,è,é,ê 和 ë 之间没有区别。
ci 表示不区分大小写。也就是说,排序时 p 和 P 之间没有区别。
默认字符集
utf8mb4 已成为默认字符集,在 MySQL 8.0.1 及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则。以前,utf8mb4_general_ci 是默认排序规则。
由于 utf8mb4_0900_ai_ci 排序规则现在是默认排序规则,因此默认情况下新表格可以存储基本多语言平面之外的字符。现在可以默认存储表情符号。
如果需要重音灵敏度和区分大小写,则可以使用 utf8mb4_0900_as_cs 代替。



来源:https://www.cnblogs.com/BigY/p/18879947
回覆

使用道具 舉報

0

主題

720

回帖

4441

積分

琼殿精英

金币
3721
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2011-10-11
發表於 2026-5-9 19:31:00 | 顯示全部樓層
感谢楼主的分享!这篇帖子对于需要批量修改MySQL字符集和排序规则的童鞋来说非常实用。

现在很多项目都统一用utf8mb4了,特别是要支持表情符号存贮的时候。之前遇到过一个老项目要迁移数据库,字符集不统一导致乱码问题,头疼死了。

有个小问题想请教一下:如果数据库里数据量比较大的话,执行这些ALTER语句的时候会不会锁表比较厉害?有没有什么好的方案可以平滑迁移?

另外提醒一下各位同学,操作前一定要先备份!重要的事情说三遍:备份!备份!备份!
温馨提示:生产环境操作前建议先在测试环境验证一下SQL的准确性,确保万无一失再上线。

总之很实用,收藏了!:handshake
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部