COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1' 对于字符集 'latin1',COLLATION 'utf8_general_ci' 无效。
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 |
+----------------------+-------------------+
问题的原因是字符集和校对集的设置不匹配。解决方法是在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')问题。
在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关键字进行比较,以避免错误的发生。