はじめに
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」を使用した方法
=> 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」を使用した方法
=> \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」パラメータを変更することで設定できます。変更は設定後の新規セッションから反映され、実行セッションには設定が反映されません。
## 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 databaselocaleを変更した場合の実行例
localeをja_JPに設定した場合の例を解説します。例では、「全角・半角」が含まれたtest_a表を使用します。
## 「全角・半角」が含まれたtest_a表があります。
=> select * from test_a;
c1
--------
AAA
AAA
(2 rows)セッションレベルでlocaleをja_JPに設定し、selectを実行した例です。ja_JPでは、「全角・半角」を区別しないため、検索条件を「AAA」(半角)とした場合は「AAA」(半角)、「AAA」(全角)が選択されます。
## 検索条件に大文字の'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演算子を併用することで「全角・半角」と「大文字・小文字」の両方を区別せずに検索することも可能です。「大文字・小文字」を区別しない方法もご覧ください。
「大文字・小文字」を区別しない方法
https://www.ashisuto.co.jp/cm/analytics-database/nodistinction_upper_lower.html
参考情報
Override the Default Locale for a Session
Specify the Default Locale for the Database
検証バージョンについて
この記事の内容は、Vertica 12.0で確認しています。
更新履歴
2023/08/22 本記事を公開