非法混合的字符集 MySQL 错误

22 浏览
0 Comments

非法混合的字符集 MySQL 错误

在处理大量数据时,我遇到了一个奇怪的错误...

错误编号: 1267
collations(latin1_swedish_ci,IMPLICIT)和(utf8_general_ci,COERCIBLE)之间的不合法混合,用于操作 '='
SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again æ˜" ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

有什么办法可以解决这个问题吗?我是否可以以某种方式转义字符串,以避免出现此错误,还是我需要以某种方式更改表的编码,如果是这样,我应该更改为什么?

0
0 Comments

Illegal mix of collations MySQL Error(不合法的字符混合排序规则MySQL错误)是由于数据库表和连接的编码不一致导致的。解决方法是将表的编码和连接的编码都设置为UTF-8。

首先,需要执行以下SQL语句来设置表的编码为UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

然后,需要执行以下SQL语句来设置连接的编码为UTF-8:

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';

这两个命令都是必需的,不能只执行其中一个。

如果想要影响所有的表而不仅仅是一个表,可以使用以下SQL语句来设置数据库的默认编码为UTF-8:

ALTER DATABASE myDb DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

需要注意的是,ALTER DATABASE命令不会改变当前表的设置,只会影响新创建的表。但是,修改数据库的默认字符集也是一个好习惯。

另外,需要在每次连接数据库时都执行SET NAMES和SET CHARACTER SET命令来更改连接的编码。可以根据客户端库的不同,选择更优雅的方法来实现(例如php::mysqli库支持更优雅的方法,而php::mysql库不支持)。

如果仍然遇到问题,可能会出现以下错误信息:

Error Number: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

此时,可以运行以下命令来查看表的创建语句:

SHOW CREATE TABLE keyword;

请将结果发布在这里,以便进一步排查问题。

0
0 Comments

在MySQL中出现(Illegal mix of collations MySQL Error)这个错误的原因是因为在查询或比较操作中,涉及到了不同的字符集或校对规则。解决这个问题的方法是使用CONVERT函数来显式地指定字符集。

例如,在查询中使用CONVERT函数可以解决这个问题:

SELECT * FROM table_name WHERE CONVERT(column1 USING utf8) = 'some_value';

其中,column1是出现错误的列名,utf8是希望使用的字符集。通过在查询中使用CONVERT函数,可以将column1的字符集转换为utf8,从而解决错误。

另外,还可以使用COLLATE子句来指定校对规则。例如:

SELECT * FROM table_name WHERE column1 COLLATE utf8_general_ci = 'some_value';

这里的utf8_general_ci是希望使用的校对规则。通过在查询中使用COLLATE子句,可以将column1的校对规则设置为utf8_general_ci,从而解决错误。

总之,当出现(Illegal mix of collations MySQL Error)错误时,可以通过使用CONVERT函数或COLLATE子句来指定字符集或校对规则,从而解决问题。

0
0 Comments

MySQL错误“Illegal mix of collations”通常是由于字符集不匹配或混合使用不同字符集引起的。要解决这个问题,需要将字符集和排序规则统一设置为相同的值。

首先,可以通过以下命令将连接字符集设置为utf8_general_ci:

SET collation_connection = 'utf8_general_ci';

然后,对于你的数据库和表,可以使用以下命令将它们的字符集和排序规则转换为utf8_general_ci:

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

有时MySQL会默认使用latin1_swedish_ci,这可能是由于MySQL最初由一家瑞典公司开发的缘故。如果没有权限执行第一个命令,只执行第二个命令也可以解决问题。

然而,有些情况下这些命令可能并不奏效。例如,即使尝试了所有在论坛中提供的方法,数据库默认字符集仍然无法从'ucs2_bin'更改,或者在执行'='操作时仍然出现错误"SQL Error (1267): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (ucs2_bin,IMPLICIT)"。

在生产环境中执行这些操作可能是不安全的,因为这可能会导致数据与应用程序连接时设置的字符集不匹配,从而导致数据在网页上的输出出现问题。因此,在执行这些命令之前,应先审查应用程序连接到数据库的设置,确保没有潜在的问题。

对于使用docker-compose的MySQL容器,可以通过在docker-compose.yml文件中的mysql服务下添加以下命令来实现:

command: --character-set-server=utf8 --collation-server=utf8_general_ci

这样可以在容器启动时设置MySQL的字符集和排序规则。

0