排序规则的非法混合MySQL错误

排序规则的非法混合MySQL错误,mysql,sql,mysql-error-1267,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 昔 ã‹ã‚‰ ã‚ã

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

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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'
我能做些什么来解决这个问题?我是否可以以某种方式转义字符串以避免发生此错误,或者我是否需要以某种方式更改表编码,如果是,我应该将其更改为什么

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


一般来说,最好的方法是更改表排序规则。然而,我有一个旧的应用程序,不能真正估计结果是否有副作用。因此,我设法将字符串转换成其他格式,从而解决了排序问题。 我发现有效的方法是通过将字符串转换为其字符的十六进制表示来进行字符串比较。在数据库上,这是通过
HEX(列)完成的。
对于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);
}
公共静态函数strothex($string)
{
$hex='';

对于($i=0;$i我的表最初是用CHARSET=latin1创建的。在表转换为utf8后,一些列没有转换,但这并不明显。 您可以尝试运行
SHOW CREATE TABLE my_TABLE;
查看哪一列未转换,或者使用下面的查询修复有问题列上的错误字符集(更改varchar length和CHARSET,并根据需要进行整理):


使用以下语句查找错误

如果表中有数据,请小心备份数据

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
更改表格您的表格名称转换为字符集utf8 COLLATE utf8\U general\U ci;在完成顶部答案中列出的更正后,更改服务器的默认设置

在“/etc/my.cnf.d/server.cnf”或其所在位置,将默认值添加到[mysqld]部分,使其看起来像这样:

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
资料来源:


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

将表的字符集更改为utf8

将表格名称转换为字符集utf8


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

cast(Format(amount, "Standard") AS CHAR CHARACTER SET utf8) AS Amount
还有一个
convert()
函数。有关它的详细信息


另一个资源

我的用户帐户没有按照建议更改数据库和表的权限

如果像我一样,您不关心(您正在使用“=”运算符),则可以应用反向修复。请在选择之前运行此操作:

SET collation_connection='latin1_-swedish_-ci';

这两个都是必需的,或者我可以只做其中一个吗?ALTER DATABASE
myDb
DEFAULT CHARACTER SET utf8 COLLATE utf8\u bin。这样做行吗?这样做会影响我的所有表,而不仅仅是其中一个表ALTER DATABASE不会更改您当前的表设置,而是新创建的表设置。尽管更改DEFAULT不会有什么坏处数据库的字符集。设置名称和设置字符集将更改您的连接编码。每次连接时都需要发出这些命令。您的客户端库可能支持更优雅的方法来执行此操作(php::mysqli有,php::mysql没有)。现在似乎还可以,我会在更多的测试后接受。第二个查询需要运行一次,还是在每个脚本开始时运行?@Ben:它最初是由一家瑞典公司开发的……这就是令人讨厌的latin1_Swedish_ci初始设置背后的原因(我没有权限执行第一条语句,但它仅在执行表时起作用。看起来这对很多人都有效,但不幸的是,即使在此线程中尝试了所有设备,我仍然存在此问题。我的数据库默认排序规则顽固地拒绝从“ucs2_-bin”更改,因此甚至尝试更改所有表和连接排序规则到“usc2_-bin”,但我仍然得到错误“SQL错误(1267):操作“=”的排序规则(utf8_-general_-ci,隐式)和(ucs2_-bin,隐式)非法混合”。在满是数据的生产数据库上执行此操作真的安全吗?不,不安全,事实上这是一个非常糟糕的主意。连接的应用程序可能会设置一个字符集,并可能直接在web上输出数据,例如,使用与数据不匹配的字符集头。这些命令在生产中非常危险,并且应该与对连接到数据库的应用程序进行的任何潜在问题的审核同时进行。这个错误,它是可注入的还是不可注入的?这是否回答了您的问题?对我来说,这是有效的:CONVERT(“column1”使用拉丁语1)谢谢你的发帖。我的数据库已经设置为utf8,我的会话字符集和排序规则都是utf8和二进制。这是唯一一个没有深入挖掘的修复方法。
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
CONVERT(column1 USING utf8)
cast(Format(amount, "Standard") AS CHAR CHARACTER SET utf8) AS Amount