[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 メーリングリストの案内