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这种设计提供了一定的灵活性,但不同的字段都提供了设置,其实不是太有必要!

原文地址:https://www.cnblogs.com/lzfhope/p/14044759.html