【问题标题】:COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'COLLATION 'utf8_general_ci' 对 CHARACTER SET 'latin1' 无效
【发布时间】:2026-01-19 17:05:01
【问题描述】:

我正在尝试修复字符编码问题 - 之前我们为此列设置了排序规则 utf8_general_ci 导致问题,因为它不区分重音..

我正在尝试查找数据库中可能受到影响的所有条目。

set names utf8;
select * from table1 t1 join table2 t2 on (t1.pid=t2.pid and t1.id != t2.id) collate utf8_general_ci;

但是,这会产生错误:

ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
  1. 数据库现在定义为DEFAULT CHARACTER SET utf8
  2. 表是用CHARSET=utf8定义的
  3. “pid”列定义为:CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
  4. 服务器版本为 Server version: 5.5.37-MariaDB-0ubuntu0.14.04.1 (Ubuntu)

问题:当 latin1 似乎没有出现在表/架构定义中的任何位置时,为什么我会收到关于 latin1 的错误?

MariaDB [(none)]> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

MariaDB [(none)]> SHOW VARIABLES LIKE '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

【问题讨论】:

  • 请发帖SHOW CREATE TABLE table1SHOW CREATE TABLE table2。您的客户端连接字符集是什么?也发帖SHOW VARIABLES LIKE '%char%'
  • 哦,你确实有set names utf8 所以希望character_set_client 会显示utf8
  • 请阅读MY POST,了解如何发布有用的好问题...有一些提示和格式化工具可以帮助您格式化查询、表格等等!
  • @MichaelBerkowski - 我修复了问题中的查询 - 它应该是针对自身的自联接,而不是 table1 和 table2。
  • 这可能在这方面很有帮助:scottlinux.com/2017/03/04/…

标签: mysql


【解决方案1】:

首先运行这个查询

SHOW VARIABLES LIKE '%char%';

你有character_set_server='latin1'

如果是这样,请进入您的配置文件 my.cnf 并添加或取消注释这些行:

character-set-server = utf8
collation-server = utf8_unicode_ci

重启服务器。 是的,聚会迟到了,刚刚遇到了同样的问题。

【讨论】:

  • 应该是character-set-server 还是character_set_server
  • 应该是character-set-server
  • character_set_server, MySQL 5.5
  • 在哪里可以找到 my.cnf 文件?
  • 你可以运行mysql --help
【解决方案2】:

在 MariaDB (10.1.36-MariaDB) 中使用括号和 COLLATE 语句的组合会产生相同的错误。我的 SQL 不一样,错误是一样的,我有:

SELECT *
FROM table1
WHERE (field = 'STRING') COLLATE utf8_bin;

省略括号是为我解决它。

SELECT *
FROM table1
WHERE field = 'STRING' COLLATE utf8_bin;

【讨论】:

  • 如果不能省略括号,请改用 BINARY:SELECT * FROM table1 WHERE BINARY field = BINARY 'STRING';
【解决方案3】:

在我的例子中,我创建了一个数据库并提供了排序规则 'utf8_general_ci',但所需的排序规则是 'latin1'。将我的排序规则类型更改为latin1_bin 后,错误消失了。

【讨论】: