字符集'latin1'不支持排序规则'utf8_general_ci'。

50

我正在尝试解决字符编码问题 - 之前我们将此列的排序规则设置为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%' - Michael Berkowski
哦,你确实有 set names utf8,所以希望 character_set_client 会显示 utf8 - Michael Berkowski
这可能在这方面非常有帮助:https://scottlinux.com/2017/03/04/mysql-mariadb-set-character-set-and-collation-to-utf8/ - MBT
3个回答

54

首先运行这个查询:

SHOW VARIABLES LIKE '%char%';

您在帖子中显示了character_set_server ='latin1'...

因此,请进入您的my.cnf并添加或取消注释这些行:

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

重启服务器。


4
这应该是 character_set_server,而不是 character-set-server - user151841
2
它应该是 character-set-server。 - ath j
1
在哪里找到my.cnf文件? - Jitendra Pancholi
1
你可以运行mysql --help - Bogdan Le
MariaDB - my.cnf 文件位置,我找不到它的位置,请帮忙。 - Afgan
显示剩余6条评论

8

在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;

3
如果不能省略括号,请使用BINARY代替: SELECT * FROM table1 WHERE BINARY field = BINARY 'STRING'; - Mel_T

3

在我的情况下,我创建了一个数据库并给它设置了排序规则'utf8_general_ci',但需要的排序规则是'latin1'。在将我的排序类型更改为latin1_bin后,错误消失了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接