簡體   English   中英

非法混合排序規則 MySQL 錯誤

[英]Illegal mix of collations MySQL Error

我在處理大量數據時遇到這個奇怪的錯誤......

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 有時會無緣無故地偷偷溜進去。

CONVERT(column1 USING utf8)

解決了我的問題。 其中 column1 是給我這個錯誤的列。

您應該將表編碼和連接編碼都設置為UTF-8

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

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

錯誤使用以下語句

如果表中有數據,請注意備份數據。

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

一般來說,最好的方法是更改表排序規則。 但是我有一個舊的應用程序,並不能真正估計這是否有副作用的結果。 因此,我嘗試以某種方式將字符串轉換為解決排序規則問題的其他格式。 我發現有用的是通過將字符串轉換為字符的十六進制表示來進行字符串比較。 在數據庫上,這是通過HEX(column). 對於 PHP,您可以使用此 function:

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 字符,因此盡管這會更改原始字符串,但比較應該起作用(轉換 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;

我發現使用cast()對我來說是最好的解決方案:

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

還有一個convert() function。這里有更多詳細信息

另一個資源在這里

修改表的字符集為utf8

更改表 your_table_name 轉換為字符集 utf8

本解決方案中所建議的,我的用戶帳戶沒有更改數據庫和表的權限。

如果像我一樣,您不關心字符排序規則(您使用的是“=”運算符),則可以應用反向修復。 在您的 SELECT 之前運行此命令:

SET collation_connection = 'latin1_swedish_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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM