sql >> データベース >  >> RDS >> Mysql

SET CHARACTER SET utf8は必要ですか?

    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がクエリを処理するために使用するエンコーディング/トランスコーディング手順とその結果は多段階のものです:

    1. MySQLは、着信クエリをcharacter_set_clientでエンコードされているものとして扱います。 。
    2. MySQLはcharacter_set_clientからステートメントをトランスコードします character_set_connection
    3. 文字列値を列値と比較する場合、MySQLは文字列値をcharacter_set_connectionからトランスコードします 指定されたデータベース列の文字セットに挿入し、列の照合を使用して並べ替えと比較を行います。
    4. 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で静的に設定できます )すべての接続で必要な追加のクエリのパフォーマンスオーバーヘッドから解放されます。



    1. MySQLのデータベースクエリ効率の最大化-パート2-

    2. MySQLでibdata1ファイルを縮小/パージする方法

    3. MYSQLDATEDIFFで時間のみを表示する

    4. whileとSQLinforeachを最適化する