目次
はじめに
SQLの実行時に、「全角・半角」を区別するかどうかは、データベース毎に動作が異なります。Verticaは、デフォルトでは「全角・半角」を区別して扱うため、お客様からは想定した結果が得られないといったご相談をいただくことがあります。本記事では、localeを使用し「全角・半角」を区別しない方法をご紹介します。
localeとは
localeとは、ユーザの言語や国、照合順序などの特殊な設定を指定するものであり、Verticaでは文字列関数の動作やSQLコマンドの順序付け(例:ORDER BY)などに使用されます。localeの詳細は、以下のマニュアルをご参照ください。
Implement locales for international data sets
「全角・半角」を区別しない方法
デフォルトのlocaleは、en_USが設定されています。localeにja_JPを設定すると「全角・半角」が区別されません。localeの設定方法
セッションレベルで設定する場合
セッションレベルのlocalは、vsqlやクライアントドライバのパラメータを変更することで設定できます。変更は実行セッションにて、即時反映されます。vsqlの設定例
vsqlの場合は、「SET LOCALE TO」あるいは「\locale」で設定します。「SET LOCALE TO」を使用した方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
=> show locale; name | setting --------+-------------------------------------- locale | en_US@collation=binary (LEN_KBINARY) (1 row) => SET LOCALE TO ja_JP; INFO 2567: Canonical locale: 'ja_JP' Standard collation: 'LJA' Japanese (Japan) 日本語 (日本) SET => show locale; name | setting --------+------------- locale | ja_JP (LJA) (1 row) |
「\locale」を使用した方法
1 2 3 4 5 6 7 8 9 10 |
=> \locale en_US@collation=binary => \locale ja_JP INFO 2567: Canonical locale: 'ja_JP' Standard collation: 'LJA' Japanese (Japan) 日本語 (日本) => \locale ja_JP |
クライアントドライバの設定例
ODBC、JDBC、ADO.NET のlocaleを設定する方法は、以下のマニュアルをご参照ください。Setting the locale and encoding for ODBC sessions
Setting the locale for JDBC sessions
Setting the locale for ADO.NET sessions
ODBC データソースをご利用の場合は、「Server Settings」→「Locale」から設定できます。
DBレベルで設定する場合
DBレベルのlocalは、「DefaultSessionLocale」パラメータを変更することで設定できます。変更は設定後の新規セッションから反映され、実行セッションには設定が反映されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
## localeを変更します。 => ALTER DATABASE SET DefaultSessionLocale = 'ja_JP'; ALTER DATABASE ## 変更後の値はCONFIGURATION_PARAMETERSシステムテーブルから確認します。 => select * from CONFIGURATION_PARAMETERS where parameter_name ='DefaultSessionLocale'; -[ RECORD 1 ]-----------------+------------------------------------------------------------ node_name | ALL parameter_name | DefaultSessionLocale current_value | ja_JP restart_value | ja_JP database_value | ja_JP default_value | en_US@collation=binary current_level | DATABASE restart_level | DATABASE is_mismatch | f groups | allowed_levels | NODE, DATABASE superuser_visible_only | f change_under_support_guidance | f change_requires_restart | f description | Defines the default session startup Locale for the database |
localeを変更した場合の実行例
localeをja_JPに設定した場合の例を解説します。例では、「全角・半角」が含まれたtest_a表を使用します。
1 2 3 4 5 6 7 8 |
## 「全角・半角」が含まれたtest_a表があります。 => select * from test_a; c1 -------- AAA AAA (2 rows) |
セッションレベルでlocaleをja_JPに設定し、selectを実行した例です。ja_JPでは、「全角・半角」を区別しないため、検索条件を「AAA」(半角)とした場合は「AAA」(半角)、「AAA」(全角)が選択されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
## 検索条件に大文字の'AAA'を指定しSELECTを実行します。 => select * from test_a where c1='AAA'; c1 ----- AAA (1 row) ## localeをja_JPに設定します。 => \locale ja_JP INFO 2567: Canonical locale: 'ja_JP' Standard collation: 'LJA' Japanese (Japan) 日本語 (日本) => \locale ja_JP ## 検索条件に半角かつ大文字の'AAA'を指定しSELECTを実行します。 => select * from test_a where c1='AAA'; c1 -------- AAA AAA (2 rows) |
補足
本記事のlocaleとilike演算子を併用することで「全角・半角」と「大文字・小文字」の両方を区別せずに検索することも可能です。「大文字・小文字」を区別しない方法もご覧ください。「大文字・小文字」を区別しない方法
http://vertica-tech.ashisuto.co.jp/nodistinction_upper_lower/
参考情報
Override the Default Locale for a SessionSpecify the Default Locale for the Database