mysql8的collate问题和修改
环境
os:centos 7.6
数据库:8.0.22 64bit
问题:
字段a,b它们的collate不一样,结果关联的时候,发现错误。
查询了以下,发现挺多的,逐个修改听麻烦的,于是整理了如下sql:
-- -- 生成需要修改的 内容 -- 暂时用于 varchar类型字段,其它没有试验过 -- 也可以用用于检查 SELECT CONCAT( 'alter table ', table_schema, '.', table_name, ' modify ', column_name, ' ', column_type, CASE WHEN is_nullable = 'YES' THEN ' null ' ELSE ' not null ' END, ' COLLATE utf8mb4_0900_ai_ci ', ' comment ''', column_comment, ''';' ) AS cc FROM information_schema.`COLUMNS` a WHERE table_schema IN ( 'rap_goldhill', 'rap_goldhill_coll' ) AND collation_name != 'utf8mb4_0900_ai_ci' ORDER BY table_name ;
几秒Ok!
collcate 做啥用,请参考 https://www.cnblogs.com/qcloud1001/p/10033364.html
根据原文的意思:collate的作用是用于确定排序规则
utf8mb4_0900_ai_ci 含义:
utf9mb4:表示适用于字符集 utf8mb4
0900:指代unicode比较算法的编号( Unicode Collation Algorithm version)
ai:表示accent insensitive(发音无关),例如e, è, é, ê 和 ë是一视同仁的
ci:这是Case Insensitive的缩写,即大小写无关,也就是说"A"和"a"在排序和比较的时候是一视同仁的
utf8mb4_0900_ai_ci的整个含义就是说:适用于utf8mb4的部分音调、大小写,编号为0900的排序算法
因为部分音调和大小写,所以比较速度比较快,但可能不能满足特定业务要求,特定的表应该根据业务需要来设定。
mysql这种设计提供了一定的灵活性,但不同的字段都提供了设置,其实不是太有必要!