Mysql表字段的排序规则不一致,可能导致查询错误,用此方法排查。
- 实际项目中,可能没有规范的限制,导致项目不断迭代过程中出现数据库表的字符集不一致的情况。
- 不同工具navcat、dbever等软件在创建表时,可能默认的字符集不一致,导致忽视字符集问题
- 大多数情况下,字符集不一致也能正常访问数据。但是在某些情况下可能出现线上BUG。例如,使用Order By、Group By、=、Join等方式时,就会SQL报错。
解决的方式就是改字符集,下面SQL可以直接扫描数据库中字段的字符集
- 第一步 先查询出表的字符集,先改正表可能出现的字符集问题
数据库所有表排序规则
-- 数据库所有表排序规则
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 '字段',
CHARACTER_SET_NAME '原字符集',
COLLATION_NAME '原排序规则',
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 ),
';'
) '修正SQL'
from information_schema.`COLUMNS`
where COLLATION_NAME != 'utf8mb4_general_ci' AND TABLE_SCHEMA = '你的数据库名';
修改完整后,重新尝试执行报错的SQL。

292

被折叠的 条评论
为什么被折叠?



