照合順序の不正な組み合わせMySQLエラー


124

大量のデータを処理しているときに、この奇妙なエラーが発生します...

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

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


このエラー、それは注射可能かどうか?
hamza irizaj 2017年

1
これはあなたの質問に答えますか?MySqlでの照合エラーの不正な組み合わせ
Farhan

回答:


288
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は、合理的な理由なしにスウェーデンに潜入することがあります。


3
@ベン:直接コピー貼り付け可能なソリューションをありがとうございます。時間を大幅に節約できました。
ピストス2013年

15
@Ben:それは、最初にスウェーデンの会社によって開発されました...それは迷惑なlatin1_swedish_ci初期設定の背後にある理由..です:(
Vajk Hermecz

1
最初のステートメントを実行する権限がありませんでしたが、テーブルを実行するだけで機能しました
Rob Sedgwick

これであなたを愛して!:P
15年

これは多くの人にとってうまくいくように見えますが、残念ながら、このスレッドのすべてのデバイスを試した後でも、まだこの問題が発生します。データベースのデフォルトの照合順序が頑固に「ucs2_bin」からの変更を拒否しているため、すべてのテーブルと接続の照合順序を「usc2_bin」に変更しようとしても、エラー「SQLエラー(1267):不正な照合順序の組み合わせ(utf8_general_ci、IMPLICIT)および(ucs2_bin、IMPLICIT)オペレーション '=' "。
bikeman868 2016年

15

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

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

そして

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

これらの両方が必要ですか、それともそのうちの1つだけを実行できますか?
2009年

ALTER DATABASE myDbDEFAULT CHARACTER SET utf8 COLLATE utf8_bin。それはうまくいくでしょうか?これは、テーブルの1つだけでなく、すべてのテーブルに影響を与えるために行われます
クリックUpvote

1
ALTER DATABASEは現在のテーブル設定を変更せず、新しく作成された設定のみを変更します。ただし、データベースのデフォルトの文字セットを変更しても問題はありません。
Quassnoi、2009年

SET NAMESおよびSET CHARACTER SETは、接続エンコーディングを変更します。接続するたびにこれらのコマンドを発行する必要があります。あなたのクライアントライブラリはそれを行うためのよりエレガントな方法をサポートするかもしれません(php :: mysqliはサポートしますが、php :: mysqlはサポートしません)。
Quassnoi 2009年

今のところ動作しているようですが、さらにテストを行って受け入れます。2番目のクエリは1回実行する必要がありますか、それとも各スクリプトの開始時に実行する必要がありますか?
09年


4

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

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

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

2

一般に、最善の方法は、テーブルの照合順序を変更することです。しかし、私は古いアプリケーションを持っていて、これが副作用を持っているかどうかの結果を実際に推定することはできません。したがって、照合の問題を解決する他の形式に文字列を変換することを試みました。私が機能しているのは、文字列をその文字の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);
}

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


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;


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

を使用することcast()が私にとって最良の解決策であることがわかりました:

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

convert()機能もあります。詳細はこちら

ここに別のリソース


0

このソリューションで提案さているよう、私のユーザーアカウントにはデータベースとテーブルを変更する権限がありませんでした。

私のように、文字の照合を気にしない( '='演算子を使用している)場合は、逆の修正を適用できます。SELECTの前にこれを実行します。

SET collation_connection = 'latin1_swedish_ci';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.