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

MySQLで現在の接続のロケールを設定する方法

    MySQLには、日名または月名を返す特定の日付関数があります。特に、DATE_FORMAT()を参照しています 、DAYNAME() 、およびMONTHNAME() 関数。これらは、たとえば11月の値を返す場合があります 、または月曜日 、使用されているクエリによって異なります。ただし、必要に応じて、結果を別の言語で簡単に返すことができます。

    これらの関数が戻り値に使用する言語は、lc_time_namesから派生しています。 システム変数。この変数の値を表示するか、そのSESSIONを設定できます これらの関数の結果が目的の言語/ロケールになるように値を設定します。

    ロケール名には、Internet Assigned Numbers Authority(IANA)によってリストされた言語と地域のサブタグがあります。例には、en_USが含まれます 英語–米国en_NZ 英語–ニュージーランド 、またはes_PA スペイン語–パナマ 、など(MySQLでサポートされているロケールのリストについては、MySQLのロケールの完全なリストを参照してください)。

    この記事では、接続の現在のロケールを見つけて変更し、それがクエリの結果にどのように影響するかを確認する方法を説明します。この設定の影響を受けない関数も示します(ただし、この関数を使用するとロケールを指定できます)。

    現在のロケールを表示

    まず、lc_time_namesの現在の値を見てみましょう。 システム変数。

    SELECT @@lc_time_names;
    

    結果:

    +-----------------+
    | @@lc_time_names |
    +-----------------+
    | en_US           |
    +-----------------+
    

    したがって、現在のロケールはen_USです。 。これは、システムのロケール設定に関係なく、実際にはデフォルト値です(ただし、これはサーバーの起動時、またはGLOBALを設定することで変更できます。 値)。

    ロケールを変更する

    それでは、ロケールを変更して結果を表示しましょう。

    SET lc_time_names = 'de_BE';
    SELECT @@lc_time_names;
    

    結果:

    +-----------------+
    | @@lc_time_names |
    +-----------------+
    | de_BE           |
    +-----------------+
    

    この場合、ロケールをde_BEに変更しました 、ドイツ語–ベルギー

    使用例

    ロケールを設定してから、月の名前を返すクエリを実行する例を次に示します。次に、ロケールを別の値に設定してから、同じクエリを再度実行します。

    第1ロケール:英語–米国

    SET lc_time_names = 'en_US';
    SELECT MONTHNAME('1999-10-03');
    

    結果:

    +-------------------------+
    | MONTHNAME('1999-10-03') |
    +-------------------------+
    | October                 |
    +-------------------------+
    

    2番目のロケール:スペイン語–スペイン

    SET lc_time_names = 'es_ES';
    SELECT MONTHNAME('1999-10-03');
    

    結果:

    +-------------------------+
    | MONTHNAME('1999-10-03') |
    +-------------------------+
    | October                 |
    +-------------------------+
    

    FORMAT()関数

    lc_time_namesの値 FORMAT()には影響しません 関数ですが、この関数は、ロケールを指定できる3番目の引数を受け入れます。これが私の言いたいことの例です。

    SET lc_time_names = 'de_DE';
    SELECT 
        FORMAT(1234, 0),
        FORMAT(1234, 0, 'de_DE');
    

    結果:

    +-----------------+--------------------------+
    | FORMAT(1234, 0) | FORMAT(1234, 0, 'de_DE') |
    +-----------------+--------------------------+
    | 1,234           | 1.234                    |
    +-----------------+--------------------------+
    

    したがって、lc_time_namesを設定したとしても de_DEへ まず、FORMAT()の最初の呼び出し それを無視した。 2回目に関数を呼び出したときに、3番目の引数と同じ言語/ロケールを明示的に指定したところ、機能しました。


    1. MySQLで今週のデータを取得する方法

    2. MySQLデータベースへのリモートアクセスを有効にする

    3. 日時からのトリミング時間–フォローアップ

    4. IDが存在するときにテーブルの不明な主キーを取得する