興味深い質問...CHARSET= utf8のMySQLテーブルがあり、latin1エンコーディングで接続を開くと、どうなりますか?
これを試してみたところ、ßやæなどの文字も正しく保存および取得できました。これらの文字は、utf8とlatin1で異なるバイトシーケンスで表されているため、機能するとは思っていませんでした。
MySQLは文字エンコーディング間である種のオンザフライ変換を行っていますか?
別の接続文字セットに接続するまでは、機能しているように感じるでしょう。すると変な文字が見えてきて、きっと後悔するでしょう。
utf8 変換で読み取った場合にのみ意味を持つデータベースにバイトを格納しています。しかし、フィールドがラテン語であることを mysql に伝えると、彼は理解できませんが、いずれにせよ彼はそれらをあなたに送信します (あなたは人間であり、彼は従います)。utf8 に接続しているので、この文字セットを介してそれらを読み取り、問題なく読み取ることができます。
しかし、接続が文字セットを変更したり、後でフィールドの文字セットを変更しようとすると、問題が発生し、単一のフィールドの内容を読み取るために次のようなトリックが必要になります。
convert(cast(convert(FieldNameMessed using latin1) as binary) using utf8)
はい、mysqlは構成に応じてchrset変換を行います。接続のchrsetを変更するには、次のようなSETNAMESを使用できます。
SET NAMES utf8;