2012-01-19 10 views
3

誰でも、PostgreSQLのロケールと数値型の振る舞いについて知ることができますか?私たちはイタリアのロケールで働いています。小数点のカンマ区切りです。設定ではpostgresql.confロケール設定LC_NUMERICはPostgreSQLでどのように動作しますか?

# These settings are initialized by initdb, but they can be changed. 
lc_messages = 'it_IT.UTF-8'      # locale for system error message 
               # strings 
lc_monetary = 'it_IT.UTF-8'      # locale for monetary formatting 
lc_numeric = 'it_IT.UTF-8'      # locale for number formatting 
lc_time = 'it_IT.UTF-8'       # locale for time formatting 

何もしません!それは日付と一緒に非常に適切なやり方で動作しますが、数値型は小数点のためにDOT区切りのままです。

[email protected]:~# uname -a 
Linux server 2.6.32-36-generic-pae #79-Ubuntu SMP Tue Nov 8 23:25:26 UTC 2011 i686 GNU/Linux 

[email protected]:~# dpkg -l | grep postgresql 
ii postgresql-8.4  8.4.9-0ubuntu0.10.04 object-relational SQL database, version 8.4 
ii postgresql-client 8.4.9-0ubuntu0.10.04 front-end programs for PostgreSQL (supported) 

EDIT

異なるスコープ内のロケールの実装に問題がある持って:DB、サーバスクリプト、OSとクライアント側を。 ロケールのフォーマットを避け、en_ENロケールを使用することにしました。ロケールの書式は、出力の瞬間にのみ適用されます。

答えて

6

私はmanualを引用:

LC_NUMERIC(文字列)

はto_char()系の関数で、たとえば、書式を数値に使用するロケールを設定します。

これらは、type formatting functionsです。

SHOW lc_numeric; 

de_AT.UTF-8

SELECT to_number('13,4','999D99') 

13.4

SELECT to_char(13.4,'FM999D99') 

13,4

SET lc_numeric = 'C'; 
SELECT to_number('13,4','999D99') 
:あなたは次のデモを再現することができるはずです

RESET lc_numeric; 

Template patterns in the manual

SELECT to_char(13.4,'FM999D99') 

13.4 0。

SQL式の数字のフォーマットはではなく、はロケール設定で変更されます。それは狂気だろう。別のノートで


:あなたは(少なくとも)postgresql.confを変更した後、サーバをリロードする必要があることを認識しています。

pg_ctl reload 
+0

ありがとうございます!はい私はto_charと他の方法とconfigの変更に対するサーバーの再読み込みを認識しています。しかし、例えば "to_char"のような "というフレーズは、"例えば "の意味は、それがどこに適用され、どこにはない正確なリストですか?パフォーマンスを犠牲にしてもロケール設定を尊重するために、すべてのSELECTクエリの自動キャストを実行できますか? – Igor

+0

@Igor:私は*できますが、狂気はその道を潜んでいます。ロケールが変更されたキャストを使用するすべてのコードを破壊する可能性があります。したがって、ロケールを意識したテンプレートパターンを使用する書式設定関数にのみ適用されます。あなたは私が含まれているリンクでそれらのリストを見つける。 –

+0

あなたがすでに狂気の道を歩いてしまったコンピュータパス上に足を踏み入れると、多かれ少なかれ、あまり変わらないでしょう;)実際に私は狂気を避けるために探しています。私はコードで実装する必要があります、それは確かにエラーです!別の可能性は、あなたの言葉ではかなり怒っています、ビューでテーブルをスクリーニングし、内部をキャストすることです(これも避けたい)。 – Igor

関連する問題