非法混合的归类MySQL错误

时间:2009-06-17 16:49:53

标签: mysql sql mysql-error-1267

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

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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

我该怎么做才能解决这个问题?我可以以某种方式逃避字符串,因此不会发生此错误,或者我是否需要以某种方式更改我的表格编码,如果是这样,我应该将其更改为什么?

10 个答案:

答案 0 :(得分:255)

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有时没有明智的理由偷偷溜进瑞典语。

答案 1 :(得分:12)

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

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

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

答案 2 :(得分:7)

CONVERT(column1 USING utf8)

解决我的问题。其中column1是给出此错误的列。

答案 3 :(得分:2)

使用以下语句进行错误

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

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

答案 4 :(得分:2)

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

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

还有一个convert()函数。 here

的更多详细信息

另一资源here

答案 5 :(得分:0)

通常,最好的方法是更改​​表格排序规则。但是我有一个旧的应用程序,并不能真正估计结果是否有副作用。因此,我试图以某种方式将字符串转换为解决整理问题的其他格式。 我发现的工作是通过将字符串转换为它的字符的十六进制表示来进行字符串比较。在数据库上,这是通过HEX(column).完成的。对于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()),然后才能在数据库中使用它。由于归类类型,数据库不能在其中包含UTF8字符,因此比较应该起作用event虽然这会改变原始字符串(转换在ISO字符集中不存在的UTF8字符导致?或者这些字符被完全删除)。只需确保在将数据写入数据库时​​,使用相同的UTF8到ISO转换。

答案 6 :(得分:0)

我的表格最初是用 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;

答案 7 :(得分:0)

在最佳答案中列出更正后,请更改服务器的默认设置。

在您的&#34; /etc/my.cnf.d/server.cnf &#34;或者它位于何处将默认值添加到 [mysqld] 部分,所以它看起来像这样:

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

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

答案 8 :(得分:0)

将表的字符集更改为utf8

  

ALTER TABLE your_table_name转换为字符集utf8

答案 9 :(得分:0)

我的用户帐户无权更改数据库和表,如建议的in this solution

如果像我一样,您不关心character collation(正在使用'='运算符),则可以应用反向修订。在执行SELECT之前运行此命令

SET collation_connection = 'latin1_swedish_ci';