2013-07-18 2 views
3

У меня есть база данных PostgreSQL на общем хосте, и результат использования функции upper отличается в моей локальной базе данных из-за настройки локали.Как использовать функцию верхнего уровня PostgreSQL с другой локалью?

Вот что я хочу, и у меня в местной среде:

SELECT version(); 
-- "PostgreSQL 8.4.16 on i386-apple-darwin10.8.0, compiled by GCC i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3), 64-bit" 

SHOW LC_COLLATE; 
-- "fr_FR.UTF-8" 

SELECT upper('étienne'); 
-- "ÉTIENNE" 

Вот что я имею в производственной среде:

SELECT version(); 
-- "PostgreSQL 9.0.13 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2, 64-bit" 

SHOW LC_COLLATE; 
-- "C" 

SELECT upper('étienne'); 
-- éTIENNE 

Теперь, потому что производственная среда в общий хост, я не могу изменить локаль из-за политики хоста. Итак, есть ли другой способ получить ожидаемый результат при использовании верхней функции?

ответ

1

Обратите внимание, что вы не можете использовать в своих версиях 8.4 или 9.0 вместо сопоставления (как показано другими ответами). Это feature was introduced with Postgres 9.1.

В более ранних версиях вы не можете изменить сортировку, выбранную при создании базы данных. COLLATE ключевое слово не существует, и вы получите сообщение об ошибке, если вы пытаетесь SET LC_COLLATE = ...:

ERROR: parameter "lc_collate" cannot be changed 

Вам нужна текущая версия, чтобы сделать это.

-> SQLfiddle

Извините, но вы не повезло.

1
select upper('étienne') collate "fr_FR"; 
3

Для 9.1 и выше вы можете просто выбрать сортировку локально для запроса.
К сожалению, учитывая ваши номера версий, для которых требуется обновление, может быть полезно или может быть полезно.

SELECT UPPER('étienne' COLLATE "C")  C_Collation, 
     UPPER('étienne' COLLATE "fr_FR") FR_Collation; 

C_Collation  FR_Collation 
-------------------------------------- 
éTIENNE   ÉTIENNE 

An SQLfiddle to test with.

Смежные вопросы