COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1' 对于字符集 'latin1',COLLATION 'utf8_general_ci' 无效。

13 浏览
0 Comments

COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1' 对于字符集 'latin1',COLLATION 'utf8_general_ci' 无效。

我正在尝试修复一个字符编码问题 - 之前我们将这一列的排序规则设置为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'

问题:为什么会出现关于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 |

+----------------------+-------------------+

0
0 Comments

问题的原因是字符集和校对集的设置不匹配。解决方法是在my.cnf文件中添加或取消注释以下行:

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

然后重新启动服务器。需要注意的是应该使用character-set-server而不是character_set_server

为了找到my.cnf文件的位置,可以运行mysql --help命令查看。在Ubuntu 18.04中,my.cnf文件位于/etc/mysql/my.cnf下的[mysqld]部分。

有用户表示感谢并说问题已解决,他们的MySQL在重启后无法启动,但通过添加上述两行解决了问题。还有一位用户说尽管他已经按照建议操作,但在运行SHOW VARIABLES LIKE '%char%';命令后仍然出现错误。还有一个用户建议使用mysql --help | grep cnf命令来查找my.cnf文件的位置。

通过按照上述步骤设置字符集和校对集,可以解决(COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1')问题。

0
0 Comments

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

问题出现的原因是因为COLLATION 'utf8_general_ci'不适用于字符集'latin1'。COLLATION是一种规则,用于确定如何比较和排序字符。'utf8_general_ci'表示以不区分大小写的方式进行比较和排序,而'latin1'是一种字符集,用于存储特定的字符编码。由于'utf8_general_ci'不适用于'latin1'字符集,因此会出现错误。解决方法是使用适用于'latin1'字符集的COLLATION规则,例如'latin1_general_ci'。这样,查询语句就可以正确执行,而不会出现错误。如果无法更改COLLATION规则,可以尝试省略括号,或者使用BINARY关键字进行比较,以避免错误的发生。

0
0 Comments

在我的案例中,我创建了一个数据库并给了它'utf8_general_ci'的排序规则,但所需的排序规则却是'latin1'。在将我的排序规则更改为latin1_bin之后,错误消失了。

0