1

DBに行を挿入するのに問題があります。行に次のような文字が含まれている場合:'è'、'ò'、'ò'、'€'、'²'、'³'....など...次のようなエラーを返します(文字セットはutf8に設定されています) :

Incorrect string value: '\xE8 pass...' for column 'descrizione' at row 1 - INSERT INTO materiali.listino (codice,costruttore,descrizione,famiglia) VALUES ('E 251-230','Abb','Relè passo passo','Relè');

ただし、文字セットをlatin1または* utf8_general_ci *に設定すると、正常に機能し、エラーは見つかりません。

なぜこれが起こるのか誰かが私に説明できますか?utf8はlatin1より「大きい」といつも思っていました

編集:私もmysql_real_escape_stringを使用しようとしましたが、エラーは常に同じでした!!!!

4

3 に答える 3

5

mysql_real_escape_string()攻撃者がSQLを挿入できるようにする文字列終了引用符をエスケープするだけなので、関係ありません。

utf8latin1後者のキャラクターのスーパーセットを表現できる限り、実際に「大きい」です。ただし、すべてのバイトシーケンスが有効なutf8文字を表すわけではありません。一方、可能性のあるすべてのバイトシーケンスは有効なlatin1文字を表します。

したがって、MySQLが期待するバイトシーケンスを受信した場合utf8(ただし、そうではありません)、一部の文字はこの「不正な文字列値」エラーを引き起こす可能性があります。一方、バイトがlatin1(そうでない場合でも)あると予想される場合、それらは受け入れられますが、誤ったデータがテーブルに格納される可能性があります。

問題は、接続文字セットが、アプリケーションが文字列を送信しているエンコーディングと一致しないことです。このステートメントを使用してSET NAMES、現在の接続の文字セットを変更します。たとえばSET NAMES 'utf8'、アプリケーションがUTF-8としてエンコードされた文字列を送信している場合などです。

詳細については、接続文字セットについてお読みください。

余談ですが、utf8_general_ciは文字セットではありません。文字セットの照合ですutf8マニュアルの説明:

文字セットは、記号とエンコーディングのセットです。照合は、文字セット内の文字を比較するための一連のルールです。

于 2012-05-15T08:58:47.963 に答える
3

UTF-8のドキュメントによると、デフォルトの照合はutf8_general_ciです。アルファベットで特定の順序ではない順序が必要な場合は、文字セットに提供されている照合general_ciの1つを選択する必要があります。これは、順序に関する要件に一致するものです。utf8_*utf8

utf8テーブルとDBへの接続の両方を、できれば同じ照合でエンコードする必要があります。接続照合の設定について詳しくは、こちらをご覧ください。

完全に安全にするには、 SET NAMESの完全な構文を使用して、テーブルの照合をチェックし、接続が正しいことを確認する必要があります。utf8_*

SET NAMES 'utf8' COLLATE 'utf8_general_ci'

さまざまな照合に関する情報はここにあります

于 2012-05-15T09:03:18.727 に答える
1
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");

ユーリカ、上記はそれをしました:-)

于 2013-10-15T02:06:14.777 に答える