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

1

一般に、最良の方法は、テーブルの照合順序を変更することです。ただし、私は古いアプリケーションを使用しており、これに副作用があるかどうかの結果を実際に推定することはできません. したがって、照合の問題を解決する他の形式に文字列を変換しようとしました。私が見つけたのは、文字列をその文字の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 文字列に変換する必要があります (たとえばutf8_decode()、PHP で使用)。照合タイプのため、データベースには UTF8 文字を含めることができないため、比較は機能するはずですが、これにより元の文字列が変更されます (ISO 文字セットに存在しない UTF8 文字を変換すると ? になるか、完全に削除されます)。データベースにデータを書き込むときは、同じ UTF8 から ISO への変換を使用していることを確認してください。

于 2016-02-12T11:29:47.240 に答える
1

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

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8

于 2019-03-12T09:04:57.740 に答える
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 に答える