短い答えは、宣言VARCHARカラムに無効なUTF8文字で値を挿入することは可能であってはならないということですUTF8キャラクタセットを使用する。
これは、無効な値を無効にするためのMySQLの設計目標です。これを行う試みがあると、MySQLはエラーまたは警告を返すか、遭遇した最初の無効な文字で指定された値を自動的に切り捨てます(もっと緩やかに)。
文字セットの変換が不要な場合にMySQLが文字セット変換を実行することにより、より多くの通常の文字セットの問題が発生します。
しかし、あなたが報告している問題は、無効な文字がUTF8列に挿入されたことです。これは、latin1(ISO-8859)エンコーディングが提供され、キャラクタセットの変換が必要でしたが、ではなく、でした。
私は以前のバージョンのMySQLでは可能だったと思います。私は、BINARYに値をキャストしてからCONVERT(... USING UTF8)
にワープすることができ、MySQLは文字セットの検証を実行しないと考えています。現在のMySQL Connectorでこれが可能かどうかは分かりません。
可能であれば、それは(IMO)コネクタのバグです。
文字セットチェック/検証を回避するには、MySQLサーバーにクライアントを信頼させ、文字セットのチェックが不要であることを確認するしかありません。 (これは、MySQLサーバが文字セット変換を行わないことを意味します。クライアントはサーバに横たわり、クライアントは有効なUTF8文字を供給していることをサーバに伝えます。
基本的に、クライアントはサーバーに「こんにちはサーバー、私はUTF8文字エンコーディングを送信するつもりです」と伝えます。
そして、サーバーは「わかりました。私たちは一致して以来、どんな文字セット変換もしません。あなたが送るものは有効なUTF8だと信じています。
そして、クライアントはいたずらに自分自身に笑い声を上げます。 "Heh、heh、私は嘘をつきました。実際には有効なUTF8ではない文字エンコーディングを送信しています。
古い学校のMySQL C API(mysql_stmt_prepare
、mysql_stmt_execute
)で準備されたステートメントを使用して、文字列バインドパラメータの値として無効なUTF8エンコーディングを提供する可能性が非常に高いと思います。
[すべてのソフトウェア開発者の絶対的な最小値、絶対にUnicodeと文字セットについて知っておく必要があります(言い訳はありません))www.joelonsoftware.com/articles/ Unicode.html](http://www.joelonsoftware.com/articles/Unicode.html)と[テキストを扱うエンコーディングと文字セットについて熟知しているすべてのプログラマーが絶対に必要とするものkunststube.net/encoding/](http ://kunststube.net/encoding/) – spencer7593
文字エンコードの仕組みを知っています。 MySQLがINSERTやUPDATEでエンコーディングを無視する方法を理解できません。 –
どのような種類のデータを扱っていますか?照合を拡張utf8に変更しようとしましたか? (utf8mb4_general_ci)。 –