mysql数据数据表的排序规则修改

本文介绍了一种简便的方法来批量修改MySQL数据表字段的排序规则(Collation)。解决了因字段级Collation不同导致的外键关联问题,并提供了一个实用的SQL脚本来自动更新大量varchar类型的字段。

 

在工作中同事遇到的问题,是找一种简便的方法批量修改数据表字段的排序规则,在MySQL中叫collation,和编码CHARACTER一起出现的。collation有三种级别,分辨是数据库级别,数据表级别和字段级别。

database、table、column

问题是,mysql表外键和关联的主键不能建立关系,因为排序规则的问题。utf8_bin

网上搜到的解决办法,都提到了修改数据表级别collation排序规则。但是我遇到的场景是数据表级别已经是utf8_unicode_ci,而字段级别是utf8_general_ci,(这里我们关心的字段类型是varchar)。

由于需要修改的字段太多了,手工修改肯定是费时费力的。自然也想到了用脚本的方式批量修改,但是发现这种通过查找MySQL信息表、过滤、拼接生成批量修改的语句太好用了,而且还能做到针对varchar类型。


SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY `', column_name, '` ', DATA_TYPE, '(', CHARACTER_MAXIMUM_LENGTH, ') CHARACTER SET UTF8 COLLATE utf8_unicode_ci', (CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END), ';')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'database'
AND DATA_TYPE = 'varchar'
AND
(
    CHARACTER_SET_NAME != 'utf8'
    OR
    COLLATION_NAME != 'utf8_unicode_ci'
);

database需要改成实际数据库名字。需要注意的是,如果要修改的字段存在外键关系,那就要小心处理,删除外键,修改collation后再把外键关系加回来。

 

TABLE_CATALOG varchar 512 utf8 utf8_general_ci

TABLE_SCHEMA varchar 64 utf8 utf8_general_ci
TABLE_NAME varchar 64 utf8 utf8_general_ci
COLUMN_NAME varchar 64 utf8 utf8_general_ci
ORDINAL_POSITION bigint 21
COLUMN_DEFAULT longtext utf8 utf8_general_ci
IS_NULLABLE varchar 3 utf8 utf8_general_ci
DATA_TYPE varchar 64 utf8 utf8_general_ci
CHARACTER_MAXIMUM_LENGTH bigint 21 
CHARACTER_OCTET_LENGTH bigint 21 
NUMERIC_PRECISION bigint 21 
NUMERIC_SCALE bigint 21 
CHARACTER_SET_NAME varchar 32 utf8 utf8_general_ci
COLLATION_NAME varchar 32 utf8 utf8_general_ci
COLUMN_TYPE longtext 0 utf8 utf8_general_ci
COLUMN_KEY varchar 3 utf8 utf8_general_ci
EXTRA varchar 27 utf8 utf8_general_ci
PRIVILEGES varchar 80 utf8 utf8_general_ci

 

 

COLUMN_COMMENT varchar 255 utf8 utf8_general_ci

 

 

PRI主键约束;

UNI唯一约束;

MUL可以重复。

 

<think>好的,我现在需要帮助用户了解如何在MySQL修改表的排序规则。首先,我得回忆一下MySQL中字符集和排序规则的基本概念。排序规则决定了字符串的比较和排序方式,比如是否区分大小写,或者是基于哪种语言的规则。常见的排序规则有utf8_general_ci(不区分大小写)和utf8_bin(二进制比较,区分大小写)等。 用户的问题是要修改表的排序规则,所以我需要分步骤考虑不同的情况:修改整个表的默认排序规则,或者修改表中特定列的排序规则。此外,还需要注意修改后对现有数据的影响,以及是否需要转换现有数据的字符集。 首先,修改表的默认排序规则。这可以通过ALTER TABLE语句实现,使用DEFAULT CHARACTER SET指定字符集和COLLATE指定排序规则。例如,ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 这里需要注意,使用CONVERT TO子句会将表的字符集和排序规则转换,同时也会转换所有字符类型的列。这可能比较耗时,特别是数据量大的时候,而且会锁定表,可能影响生产环境的使用。 接下来,如果只需要修改表的默认排序规则而不影响现有列的排序规则,可以使用ALTER TABLE table_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 但这样不会改变现有列的设置,只影响后续新增的列。 然后,修改特定列的排序规则。这同样使用ALTER TABLE语句,配合MODIFY COLUMN子句。例如,ALTER TABLE table_name MODIFY COLUMN column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 这里需要指定列的数据类型,不能省略,否则会报错。需要注意的是,修改列的排序规则时,如果字符集不同,可能需要转换数据,同样会影响性能。 还需要考虑数据库和连接的字符集设置。修改表或列的排序规则后,确保数据库的连接设置(如collation_connection)与之兼容,避免出现混合排序规则导致的隐式转换问题。另外,存储过程和触发器等对象可能也会受到排序规则的影响,需要检查并修改。 另外,用户可能需要知道如何查看当前的排序规则设置。可以使用SHOW CREATE TABLE table_name; 来查看表和各列的排序规则,或者查询information_schema数据库中的COLUMNS表来获取详细信息。 潜在的问题包括:修改排序规则时字符集不兼容导致的错误,例如从utf8改为utf8mb4通常是安全的,但反过来可能有数据丢失。此外,索引和查询性能可能会因排序规则的不同而改变,比如区分大小写的排序规则可能导致查询行为变化,需要测试。 最后,应该提醒用户备份数据,并在非高峰期进行操作,避免对生产环境造成影响。如果表的现有数据已经是正确的字符集,可能只需要修改数据,但MySQL中通常需要实际转换数据,所以备份尤为重要。 总结步骤应该是:1. 确定需要修改的范围(整个表或特定列);2. 使用相应的ALTER语句;3. 检查影响,处理依赖对象;4. 备份和测试。同时,注意字符集和排序规则的关系,确保一致性。</think>在 MySQL修改表的排序规则(Collation)需要明确字符集(Character Set)和排序规则的关系。排序规则定义了字符串的排序和比较规则(如是否区分大小写)。以下是详细步骤和注意事项: --- ### **一、基本语法** #### 1. **修改表的默认排序规则** ```sql ALTER TABLE 表名 CONVERT TO CHARACTER SET 字符集名称 COLLATE 排序规则名称; ``` - **作用**:修改表的默认字符集和排序规则,并**自动转换现有列的字符集和排序规则**。 - **示例**: ```sql ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` #### 2. **仅修改表的默认排序规则(不转换现有列)** ```sql ALTER TABLE 表名 DEFAULT CHARACTER SET 字符集名称 COLLATE 排序规则名称; ``` - **作用**:仅修改表的默认排序规则,**不影响已有列**,仅对新添加的列生效。 - **示例**: ```sql ALTER TABLE users DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` #### 3. **修改某一列的排序规则** ```sql ALTER TABLE 表名 MODIFY COLUMN 列名 列数据类型 CHARACTER SET 字符集名称 COLLATE 排序规则名称; ``` - **注意**:必须指定列的完整数据类型(如 `VARCHAR(255)`)。 - **示例**: ```sql ALTER TABLE users MODIFY COLUMN username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; ``` --- ### **二、关键注意事项** 1. **数据兼容性** - 如果新旧字符集不兼容(如从 `latin1` 转到 `utf8mb4`),可能造成数据损坏。建议先备份数据。 - 使用 `SHOW CREATE TABLE 表名;` 查看当前字符集和排序规则。 2. **性能影响** - `CONVERT TO` 会重新编码数据,大表操作可能耗时较长并锁定表。 3. **索引和查询影响** - 修改排序规则可能导致索引重建,影响查询行为(如 `WHERE name = 'abc'` 是否区分大小写)。 4. **连接级设置** 确保数据库连接参数(如 `SET NAMES`)与表的字符集一致,避免隐式转换。 --- ### **三、查看当前排序规则** #### 1. 查看表的排序规则 ```sql SHOW CREATE TABLE 表名; ``` #### 2. 查看列的排序规则 ```sql SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME = '表名'; ``` --- ### **四、常见排序规则** | 排序规则 | 说明 | |-----------------------|-----------------------------| | `utf8mb4_general_ci` | 不区分大小写(默认) | | `utf8mb4_bin` | 二进制比较(区分大小写) | | `utf8mb4_unicode_ci` | 基于 Unicode 的排序(支持多语言) | --- ### **五、总结步骤** 1. **备份数据**:防止操作失误导致数据丢失。 2. **选择目标排序规则**:根据需求选择兼容的字符集和排序规则。 3. **执行 ALTER TABLE**:按需修改整个表或特定列。 4. **验证结果**:通过 `SHOW CREATE TABLE` 或查询 `information_schema` 确认修改生效。 如需进一步优化,可考虑在低峰期操作或使用在线 Schema 变更工具(如 pt-online-schema-change)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值