[pgsql-jp: 41412] Re: 複数のLIKE句 OR で繋ぐと遅い
Tatsuo Ishii
ishii @ sraoss.co.jp
2013年 6月 5日 (水) 15:40:55 JST
> 小川です。
>
>> upper関数は、半角文字に対してだけ効果あると理解しております。
>> それで、translate関数で全角大字を半角大字に変換しております。
>>
> 実はlower関数もそうなんですが、これはPostgreSQLの仕様ですか?
現在のPostgreSQLでは、ロケールがCならそうなります。
ロケールがCでない場合は、その処理系のロケールの実装次第です。手元の
Linuxでは、ロケールがja_JPの時に、全角のAをlowerに食わせると、全角のaが
返ってきます。
SQL標準では、SQL92あたりでは確かupper/lowerはASCIIに対してしか定義され
ていなかったと思います。よって、PostgreSQLのCロケールでの動作はこれを満
たしています。
SQL2003以降では、大文字や小文字の概念はユニコードの定義に丸投げされてお
り、"Unicode General Category class"で定義されているようです。ですので、
ASCII以外の文字も含まれているかもしれません(調べていないので良くわかり
ません)。
ただ、そうだとしても、lower('全角のA')が、全角のaを返すべきなのか、
ASCIIのaを返すべきなのかはSQL標準でも明確ではないような気がします。
私が業務アプリをいじるなら、こうした仕様の曖昧さや不明確さに依存せずに、
自分で変換を定義するでしょうね。その方が後々の苦労が少ないので。このあ
たりは、何が良いかと言うよりは好みの問題だと思います。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp
pgsql-jp メーリングリストの案内