Karp 的技术博客

2024-12-30T10:20:36.png
在使用 MySQL 进行数据查询时,尤其是涉及到 JOIN 操作时,您可能会遇到以下错误信息:

Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='

这个错误通常表明在进行连接操作时,涉及的字段使用了不同的字符集或排序规则(collation),导致查询失败。本文将探讨这个问题的根源,并提供解决方案和示例。

问题背景

在 MySQL 中,字符集(Character Set)和排序规则(Collation)用于定义如何存储和比较字符串数据。常见的字符集包括 utf8mb4,而排序规则则决定了字符串比较的规则,如 utf8mb4_unicode_ciutf8mb4_0900_ai_ci

当您在 JOIN 查询中使用不同字符集或排序规则的字段时,MySQL 将无法正确执行比较,进而导致上述错误。

示例场景

假设我们有两个表 usersorders,它们的结构如下:

CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);

CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    order_number VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci
);

在这个示例中,users.username 使用的是 utf8mb4_unicode_ci 排序规则,而 orders.order_number 使用的是 utf8mb4_0900_ai_ci 排序规则。

执行查询

当我们尝试执行以下查询时:

SELECT u.username, o.order_number 
FROM users u
LEFT JOIN orders o ON u.username = o.order_number;

将会出现如下错误:

Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='

解决方案

方法 1:统一字符集和排序规则

最直接的方法是确保两个表中参与比较的字段使用相同的字符集和排序规则。您可以通过以下命令修改表的列:

ALTER TABLE orders 
MODIFY order_number VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

或者,您也可以将 users.username 修改为 utf8mb4_0900_ai_ci

ALTER TABLE users 
MODIFY username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

方法 2:在查询中强制转换字符集

如果您不想或不能修改表结构,可以在查询中使用 COLLATE 关键字来强制转换字符集。例如:

SELECT u.username, o.order_number 
FROM users u
LEFT JOIN orders o ON u.username COLLATE utf8mb4_0900_ai_ci = o.order_number;

方法 3:使用 BINARY 运算符

另一种方法是使用 BINARY 运算符,这将强制将比较转换为字节比较:

SELECT u.username, o.order_number 
FROM users u
LEFT JOIN orders o ON BINARY u.username = BINARY o.order_number;

mysql

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2024年12月30日 13:16
1

目录

来自 《解决 MySQL 中的字符集冲突问题:Illegal mix of collations》