SET CHARACTER SET utf8
の使用 SET NAMES utf8
を使用した後 実際にcharacter_set_connection
をリセットします およびcollation_connection
to
@@character_set_database
および@@collation_database
それぞれ。
-
SET NAMES x
SET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
および
と同等ですSET CHARACTER SET x
SET 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
で静的に設定できます )すべての接続で必要な追加のクエリのパフォーマンスオーバーヘッドから解放されます。