?

Log in

No account? Create an account

Денежный тип в Postgres - Узором созвездий по мантии ночи

03.09.2011, Суббота

00:58:00 - Денежный тип в Postgres

Previous Entry Поделиться Next Entry

Какой идиот среди разработчиков придумал, что в результатах запроса этот тип надо возвращать уже отформатированным под локаль? Почему не оставил способа отключить эту медвежью услугу? И почему никто не поймал за руку этого гения?

Бес бы с ним, с индикатором валюты (хотя идея о том, что в базе могут хранится данные только о той валюте, что соответствует локали -- отдельный повод для жестокого обращения с автором идеи). Но вот разделитель тысяч, оказавшийся с точки зрения utf8 начальным байтом многобайтового символа...

This entry was originally posted at http://arilou.dreamwidth.org/13153.html. Please comment there using OpenID.

Comments:

[User Picture]
From:vilgeforce
Date:02.09.2011 23:38:56
(Link)
Ну а почему бы для валюты не использовать INT?
(Ответить) (Thread)
[User Picture]
From:arilou
Date:02.09.2011 23:46:40
(Link)
Numeric уж лучше. Даже в документации сказано, что мол "если вам надо хранить значения денежных сумм -- это сюда".
Хотя он, как заявлено, более медленный в вычислениях.
Да вообще, конечно, хоть строку можно. ;)
Но нафига тогда этот тип 'money' вообще?
(Ответить) (Parent) (Thread)
[User Picture]
From:vilgeforce
Date:02.09.2011 23:48:56
(Link)
Не, ну строки суммировать - хрень выйдет.
(Ответить) (Parent) (Thread)
[User Picture]
From:arilou
Date:03.09.2011 10:24:01
(Link)
Смотря как суммирование написать. ;)
Но вообще это я уже в шутку говорил. К тому, что приспособить-то другой тип можно, при желании. Но если это приходится делать при наличии как бы ровно для той задачи предусмотренного типа, просто потому, что этот предусмотренный тип предусматривался каким-то сумасшедшим -- всё-таки несколько грустно.
(Ответить) (Parent) (Thread)
[User Picture]
From:besm6
Date:03.09.2011 05:52:45
(Link)
У авторов постгреса вообще довольно плохо с пониманием i18n/l10n и utf-8 в частности. Я, помнится, только со второго захода сумел объяснить этим товарищам, что на utf-8 однобайтовые локалезависимые функции типа strcoll не работают, а надо пользоваться mb/w-вариантами, потому что оно, блин, multibyte.
(Ответить) (Thread)
[User Picture]
From:vitus_wagner
Date:03.09.2011 07:04:30
(Link)
Почему не оставил способа отключить? setlocale(LC_MONETARY,"C"). Формат валюты это отдельная категория локали, и если кому надо ее не использовать, может сделать это именно средствами локали.
(Ответить) (Thread)
[User Picture]
From:arilou
Date:03.09.2011 10:44:44
(Link)
Угу. Перед запросом менять локаль, в зависимости от того, что нам нужно? Или просто перманентно жить под LC_MONETARY=C просто для противодействия гениальности разработчика? Да ещё на всех компах, под разными операционками?

А если у меня в одно таблице хранятся суммы в разных валютах?

Кстати, если уж оно столь чутко к локали -- почему оно под виндой (на ноуте) не отреагировало на то, что я в настройках поменял символ разделителя тысяч?

Ну, ладно, допустим, 'C'. Это -- "отключить"? А вот нет:

arilou=> set lc_monetary='C';
SET
arilou=> show lc_monetary;
 lc_monetary 
-------------
 C
(1 row)

arilou=> select '12112.01'::money;                                                                                                              money    
------------
 $12,112.01
(1 row)
(Ответить) (Parent) (Thread)