web-dev-qa-db-ja.com

照合の不正な組み合わせ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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€'

これを解決するにはどうすればよいですか?このエラーが発生しないように文字列を何らかの方法でエスケープできますか、何らかの方法でテーブルエンコーディングを変更する必要がありますか?

109
Click Upvote
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は、賢明な理由もなく、時々スウェーデン語を潜入します。

259
Ben Hughes

テーブルエンコーディングと接続エンコーディングの両方をUTF-8に設定する必要があります。

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

そして

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';
12
Quassnoi
CONVERT(column1 USING utf8)

私の問題を解決します。 column1は、このエラーを発生させる列です。

7
Binaya Shrestha

エラーには次のステートメントを使用します

データがテーブルにある場合は、データのバックアップを取ることに注意してください。

 ALTER TABLE your_table_name文字セットに変換utf8 COLLATE utf8_general_ci;
2
vpgodara

一般的に、最良の方法はテーブルの照合順序を変更することです。しかし、私は古いアプリケーションを使用しており、これに副作用があるかどうかの結果を実際に推定することはできません。そのため、文字列を照合問題を解決する他の形式に変換しようとしました。私が働いているのは、文字列をその文字の16進表現に変換することで文字列比較を行うことです。データベースでは、これは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);
}

データベースクエリを実行する場合、DBで使用する前に、元のUTF8文字列を最初にiso文字列に変換する必要があります(たとえば、PHPでutf8_decode()を使用)。照合タイプのため、データベースにUTF8文字を含めることはできないため、比較は元の文字列を変更しますが、イベントは機能します(ISO文字セットに存在しないUTF8文字を変換すると、?になるか、これらが完全に削除されます)。データベースにデータを書き込むときは、必ず同じUTF8からISOへの変換を使用するようにしてください。

1
Stephan

テーブルの文字セットをutf8に変更します

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8

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

0
ITI

元々CHARSET = latin1でテーブルを作成しました。 tf8へのテーブル変換後、一部の列は変換されませんでしたが、それは実際には明らかではありませんでした。 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;
0
A Kunin