136

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

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

我能做些什么来解决这个问题?我可以以某种方式转义字符串以便不会发生此错误,还是我需要以某种方式更改我的表编码,如果是这样,我应该将其更改为什么?

4

10 回答 10

311
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 有时会无缘无故地潜入瑞典语。

于 2009-06-17T16:59:11.090 回答
18
CONVERT(column1 USING utf8)

解决了我的问题。其中 column1 是给我这个错误的列。

于 2018-04-23T11:08:03.680 回答
15

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

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';
于 2009-06-17T16:59:44.723 回答
3

使用以下语句表示错误

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

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
于 2018-01-11T08:16:04.837 回答
2

我的表最初是用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;
于 2017-10-08T02:30:12.747 回答
2

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

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

还有一个convert()功能。更多细节在这里

这里的另一个资源

于 2020-02-19T17:05:55.290 回答
1

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

于 2016-02-12T11:29:47.240 回答
1

将表格的字符集改为utf8

ALTER TABLE your_table_name 转换为字符集 utf8

于 2019-03-12T09:04:57.740 回答
1

我的用户帐户没有按照此解决方案中的建议更改数据库和表的权限。

如果像我一样,您不关心字符排序规则(您使用的是 '=' 运算符),则可以应用反向修复。在您的 SELECT 之前运行它:

SET collation_connection = 'latin1_swedish_ci';
于 2020-07-11T03:26:41.863 回答
0

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

在您的“ /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

于 2018-03-22T17:21:06.603 回答