- ベストアンサー
postgresql のupper関数について
いつもお世話になっております。 標題についてご教授下さい。 DBからある項目をupper関数を使って変換しているのですが、 変換されません。 UPPERは文字列などを大文字に変換する認識なのですが、 わかりません。 [table A] key1 Test key2 test SELECT upper(key1), upper(key2) from A 結果 key1 key2 Test TEST 全角の英字が変換されません。 そもそも全角はtranslateしないとだめでしょうか。 お手数ですが、宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ロケール(lc_ctype)の設定とロケールライブラリの実装に依存します。 日本語のロケールであればロケールライブラリの実装に依存しますが、少なくとも手元のLinux環境ではupper関数で全角アルファベットの小文字を大文字に変換できます。 現在のロケールは以下のSQLで確認できます。 =# SHOW lc_ctype; lc_ctype ---------- C (1 行) Cというのはロケールなしの状態です。これが日本語のロケール(ja_JP.文字コード)になっていれば全角アルファベットでも変換できます。 PostgreSQL 8.4以降であればデータベースごとにロケールを指定できます。以下のSQLで日本語のロケールを指定してデータベースを作成できます。 =# CREATE DATABASE test TEMPLATE template0 LC_CTYPE 'ja_JP.UTF8'; CREATE DATABASE 日本語のロケールのデータベースに接続し、upper関数を実行すると全角アルファベットでも大文字に変換できます。 =# \c test You are now connected to database "test". =# SELECT upper('a'); upper ------- A (1 row)
その他の回答 (2)
- utakataXEX
- ベストアンサー率69% (711/1018)
#1 です。 おー、#2さんのおっしゃる通りでした。 今、試してみました。 全角のまま大文字になるんですね。 勉強になりました。
- utakataXEX
- ベストアンサー率69% (711/1018)
>そもそも全角はtranslateしないとだめでしょうか はい。upper は半角小文字を大文字にするだけです。 upper( translate( カラム ) ) ですね。
お礼
返信が遅れて申し訳ありません。 >SHOW lc_ctype; 確かに手前の環境では Cと表示されました。 これが原因だったんですね。 ありがとうございます。 大変参考になりました。