【转载】mysql数据数据表的排序规则修改

在工作中同事遇到的问题,是找一种简便的方法批量修改数据表字段的排序规则,在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可以重复。
--------------------- 
作者:privateobject 
来源:CSDN 
原文:https://blog.csdn.net/privateobject/article/details/78363809 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,表的排序规则被称为“排序规则(Collation)”。它是一种用于定义字符排序和比较的机制。不同的排序规则可以影响字符串比较的结果。例如,在某些排序规则下,大小写字母被视为不同,而在其他排序规则下,它们被视为相同。 如果要修改MySQL表的排序规则,可以按照以下步骤进行: 1. 确定现有排序规则:使用以下命令,可以查看表的当前排序规则。 SHOW TABLE STATUS WHERE Name='table_name'; 2. 确定新的排序规则:可以从MySQL官方文档中查找可用的排序规则,并选择适合您的应用程序的规则。例如,如果您需要对非英语文本排序,可以选择支持多字节字符集(MB)的规则。 3. 更改表的排序规则:使用以下命令更改表的排序规则。 ALTER TABLE table_name CONVERT TO CHARACTER SET charset_name COLLATE collation_name; 其中,charset_name是您要使用的字符集的名称,collation_name是您要使用的排序规则的名称。 4. 确认更改:使用SHOW TABLE STATUS WHERE Name='table_name';检查表的状态,以确认更改是否成功。 5. 注意事项:修改表的排序规则可能会影响数据排序和比较。如果您要在应用程序中使用新的排序规则,请确保您的代码和数据库查询语句都考虑了这个变化。 总之,修改MySQL表的排序规则是一项敏感的任务,需要谨慎考虑和测试。正确地选择和应用排序规则可以提高应用程序的性能,并确保在不同字符集下的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值