报错信息:
; uncategorized SQLException; SQL state [HY000]; error code [1267]; Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='; nested exception is java.sql.SQLException: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='
这个错误通常表示在进行字符串比较时使用了不兼容的字符集或校对规则,导致 MySQL 数据库引擎无法执行操作。
错误信息中提到了两种不同的字符集和校对规则:utf8_general_ci
和 utf8_unicode_ci
。 MySQL 数据库使用校对规则来确定如何对字符串进行排序和比较。在使用等于(==
)操作符时,要求待比较的两个字符串必须具有相同的字符集和校对规则。
解决这个问题的方法有两种:
1. 统一字符集和校对规则:将所有涉及到比较的字段和表的字符集和校对规则统一为同一种类型,比如 utf8_general_ci
或 utf8_unicode_ci
。可以通过 ALTER TABLE 语句修改表的字符集和校对规则,例如:
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
2.显式地指定字符集和校对规则:如果无法修改表的字符集和校对规则,你可以在执行查询时显式地指定字符集和校对规则。例如,在比较字符串时使用 COLLATE
关键字指定校对规则,如下所示:
SELECT *
FROM your_table_name
WHERE your_column_name COLLATE utf8_general_ci = 'your_value';
批量修改字符集
如果需要更改很多表甚至整个数据库所有表都需要更改字符集,可以采用以下方式进行批量修改
# 根据转换字符集 修改 utf8 ---> utf8_general_ci
SELECT
CONCAT(
'ALTER TABLE ',
TABLE_NAME,
' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
)
FROM
information_schema.`TABLES`
WHERE
TABLE_SCHEMA = 'DATABASE_NAME'; # 更改 DATABASE_NAME
通过以上语句可以得到批量更新的sql语句,然后复制下来执行就可以了
需要注意的是,在修改字符集和校对规则或者显式指定校对规则时,需谨慎考虑现有数据的影响,并确保所有涉及到比较的字段和表都使用相同的字符集和校对规则。