SET CHARACTER SET utf8の使用 SET NAMES utf8を使用した後 実際にcharacter_set_connectionをリセットします およびcollation_connection to
@@character_set_database および@@collation_database それぞれ。
-
と同等ですSET NAMES xSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x; -
および
と同等ですSET CHARACTER SET xSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
一方、SET collation_connection = x また、内部でSET character_set_connection = <<character_set_of_collation_x>>を実行します およびSET character_set_connection = x 内部的にもSET collation_connection = <<default_collation_of_character_set_xを実行します 。
つまり、基本的にはcharacter_set_connectionをリセットしていることになります。 @@character_set_databaseへ およびcollation_connection @@collation_databaseへ 。マニュアルでは、これらの変数の使用法について説明しています。
これを要約すると、MySQLがクエリを処理するために使用するエンコーディング/トランスコーディング手順とその結果は多段階のものです:
- MySQLは、着信クエリを
character_set_clientでエンコードされているものとして扱います。 。 - MySQLは
character_set_clientからステートメントをトランスコードしますcharacter_set_connectionに - 文字列値を列値と比較する場合、MySQLは文字列値を
character_set_connectionからトランスコードします 指定されたデータベース列の文字セットに挿入し、列の照合を使用して並べ替えと比較を行います。 - MySQLは、
character_set_resultsでエンコードされた結果セットを構築します (これには、結果データと、列名などの結果メタデータが含まれます)
したがって、SET CHARACTER SET utf8の場合が考えられます。 完全なUTF-8サポートを提供するには不十分です。 latin1のデフォルトのデータベース文字セットを考えてみてください およびutf8で定義された列 -文字セットを使用して、上記の手順を実行します。 latin1として UTF-8でカバーできるすべての文字をカバーすることはできません。手順3で文字情報を失う可能性があります。 。
- ステップ3 : クエリがUTF-8でエンコードされており、
latin1で表現できない文字が含まれているとします。 、これらの文字はutf8からのトランスコーディングで失われますlatin1へ (デフォルトのデータベース文字セット)クエリを失敗させます。
したがって、SET NAMES ...と言っても差し支えないと思います。 文字セットの問題を処理する正しい方法です。 MySQLサーバー変数を正しく設定することを追加するかもしれませんが(必要なすべての変数はmy.cnfで静的に設定できます )すべての接続で必要な追加のクエリのパフォーマンスオーバーヘッドから解放されます。