Кодировка Postgresql и цвет (Ubuntu)

РЕДАКТИРОВАТЬ 2: Я оставлю остальную часть текста для контекстуализации, но я обнаружил, что проблема не имеет ничего общего ни с моими резервными копиями, ни с моей моделью данных. Мне удалось воспроизвести проблему, выполнив следующие действия:

createdb -w -T template0 localeTestDb -E UTF8 --locale=pt_PT.utf8

create table test(keywords tsvector);

INSERT INTO test(keywords) VALUES((to_tsvector('portuguese','contemporânea,alho francês')));

select * from test where keywords @@ plainto_tsquery('contemporânea, alho francês');
 keywords 
----------
(0 rows)

Я установил кодировку UTF8, создал базу данных с определенной локалью, в ts_vector использовал 'portuguese', и я до сих пор не получил результатов. Создание базы данных в тех же обстоятельствах ( datcollate и datctype pt_PT.utf8, но без template0) на моем ПК работает. проблема может быть template0? если я попытаюсь сделать

createdb localeTestDb -E UTF8 --locale=pt_PT.utf8

Я получил.

Ошибка создания базы данных: ОШИБКА: новое сопоставление (pt_PT.utf8) несовместимо с сопоставлением базы данных шаблонов (en_US.UTF-8). СОВЕТ: Используйте то же сопоставление, что и в базе данных шаблонов, или используйте template0 в качестве шаблона.

Я думаю, что это как-то связано с кодированием и цвето... Я просто не знаю что.


Прежде всего, я уже искал и у меня есть некоторые идеи, мне просто нужна помощь, так как я не очень хорошо знаком с postgresql и Ubuntu. Для настройки у меня есть мой компьютер (как с Windows, так и с Linux15.10) и удаленный ПК, который обслуживает сервер (с Ubuntu 14.04.4 LTS). Итак, у меня есть база данных, и я сделал резервные копии (с кодировкой UTF8), и я могу восстановить без проблем. Эта база данных имеет таблицу с типом tsvector (ключевые слова) и функцию, которая получает varchar в качестве параметра (наряду с другими параметрами). На моем ПК (в обеих ОС) я вызываю эту функцию и получаю ожидаемые результаты, например:

select * From ufn_get_recipes_by_restrictions(1, '{"contemporânea"}', '{-1}')

возвращается

id, name          author
1;"Pato Grelhado";"Neuza"

Обратите внимание на специальный символ

â

НО, с одинаковыми сценариями для создания таблиц / функций и одинакового восстановления, когда я вызываю одну и ту же функцию с одинаковыми параметрами, я получаю 0 строк. Для меня самое странное, что у меня есть этот ряд на сервере:

                                 keywords                                  
----------------------------------------------------------------------------
 'contemporân':1 'folh':5 'frut':6 'lim':2 'mil':4 'mil-folh':3 'vermelh':7

Я имею в виду... есть в таблице ключевых слов!

делать

select encoding, datcollate, datctype from pg_database where datname = 'plaza_db';

НА ОКНАХ:

encoding  |       datcollate       |       datctype   
----------+-------------+----------------------------------
        6 | Portuguese Brazil.1252 | Portuguese Brazil.1252

На моем UBUNTU:

encoding | datcollate  |  datctype   
----------+-------------+-------------
        6 | pt_PT.utf8 | pt_PT.utf8

НА СЕРВЕРЕ:

 encoding | datcollate  |  datctype   
----------+-------------+-------------
        6 | en_US.UTF-8 | en_US.UTF-8

так что... да, три разных кодировки Portugues Brazil 1252 - это <=> для WIN1252, который, насколько я помню, "похож" на "подтип" (я не знаю здесь синтаксис) UTF8. Так как он работает с этой кодировкой и pt_PT.utf8, может ли проблема быть в en_US.UTF-8? Я пытался создать с кодировкой 'LATIN1' и TEMPLATE=template0, но при восстановлении я получил сообщение о том, что какой-то специальный символ с кодировкой UTF8 не имел "перевода" в LATIN1. Что меня смущает, так это то, что строки возвращаются с правильными символами, такими как à, ê и т. Д. И т. Д., Но при поиске происходит сбой.

Что еще я могу сделать? Я видел, как некоторые люди говорили, что нужно менять локаль и переустанавливать postgresql, но так как сервер не мой, на самом деле это не вариант.

Очень ценится!

РЕДАКТИРОВАТЬ: я создал новую базу данных только для тестирования и получил это:

INSERT INTO test(keywords) VALUES((to_tsvector('portuguese','contemporânea,alho francês')));
    testencodingdb=# select * from test;      
keywords               
    --------------------------------------
     'alho':2 'contemporân':1 'francês':3
    (1 row)

когда делаешь

select * from test where keywords @@ to_tsquery('(contemporânea)&(alho|francês)');

я получил

keywords 
----------
(0 rows)

Итак, я думаю, что это проблема с этим очень конкретным сервером. А также,

 client_encoding 
-----------------
 UTF8
(1 row) 

Наконец, локаль сервера:

LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=pt_PT.UTF-8
LC_TIME=pt_PT.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=pt_PT.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=pt_PT.UTF-8
LC_NAME=pt_PT.UTF-8
LC_ADDRESS=pt_PT.UTF-8
LC_TELEPHONE=pt_PT.UTF-8
LC_MEASUREMENT=pt_PT.UTF-8
LC_IDENTIFICATION=pt_PT.UTF-8
LC_ALL=

2 ответа

Обнаружил проблему. По какой-то причине на сервере я должен указать параметр config в ts_query, в данном случае to_tsquery('portuguese', ...)

Мое непосредственное предположение было бы, что проблема - client_encoding. Могу поспорить, что он работает из Ubuntu как клиент, а не из Windows? В этом случае происходит то, что специальный символ кодируется с использованием кодовой страницы 1252, но интерпретируется с другой стороны как UTF8, что приводит к тому, что он эффективно запрашивает неправильную строку.

Попробуйте установить кодировку клиента специально для решения этой проблемы.

Другие вопросы по тегам