非法混合排序规则 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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

我该怎么做才能解决这个问题?我是否可以以某种方式转义字符串以避免出现这个错误,或者我是否需要以某种方式更改表编码,如果需要,我应该将其更改为什么?

225382 次浏览
SET collation_connection = '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 有时候会无缘无故把瑞典语放进去。

您应该将表编码和连接编码都设置为 UTF-8:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

还有

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

通常,最好的方法是更改表排序规则。然而,我有一个旧的应用程序,并没有真正能够估计的结果,这是否有副作用。因此,我尝试以某种方式将字符串转换为其他格式,以解决排序规则问题。 我发现可以通过将字符串转换为字符的十六进制表示形式来进行字符串比较。在数据库中,这是用 HEX(column). For PHP 完成的,你可以使用这个函数:

public static function strToHex($string)
{
$hex = '';
for ($i=0; $i<strlen($string); $i++){
$ord = ord($string[$i]);
$hexCode = dechex($ord);
$hex .= substr('0'.$hexCode, -2);
}
return strToUpper($hex);
}

在执行数据库查询时,必须首先将原始 UTF8字符串转换为 ISO 字符串(例如,在 PHP 中使用 utf8_decode()) ,然后才能在 DB 中使用它。由于排序规则类型,数据库中不能有 UTF8字符,所以比较应该工作事件,尽管这会改变原始字符串(转换 ISO 字符集中不存在的 UTF8字符会导致一个?或完全移除)。只要确保在将数据写入数据库时,使用相同的 UTF8到 ISO 转换即可。

我的表最初是用 CHARSET = latin1创建的。在将表转换为 Utf8之后,一些列没有被转换,但是这并不是很明显。 您可以尝试运行 SHOW CREATE TABLE my_table;,看看哪一列没有转换,或者只是修复问题列上的不正确字符集,查询如下(根据您的需要更改 varchar 长度、 CHARSET 和 COLLATE) :

 ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8
COLLATE utf8_general_ci NULL;

对于错误,请使用以下语句

注意数据备份,如果表中有数据。

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

在完成顶部答案中列出的更正后,更改服务器的默认设置。

在你的“ /etc/my.cnf.d/server.cnf”或者它所在的任何地方,将默认值添加到 [ mysqld ]部分,使它看起来像这样:

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

资料来源: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

CONVERT(column1 USING utf8)

解决了我的问题。

将表的字符集更改为 utf8

ALTERTABLE your _ TABLE _ name CONVERT TO CHARACTER SET utf8

我发现使用 cast()对我来说是最好的解决方案:

cast(Format(amount, "Standard") AS CHAR CHARACTER SET utf8) AS Amount

还有一个 convert()函数。详细信息请参阅 给你

另一个资源 给你

我的用户帐户没有更改数据库和表的权限,如建议的 在这个溶液中所示。

如果您像我一样不关心 字符校对(您使用的是’=’运算符) ,那么可以应用相反的修复程序。在您的 SELECT 之前运行这个:

SET collation_connection = 'latin1_swedish_ci';