Кодировка 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, что приводит к тому, что он эффективно запрашивает неправильную строку.
Попробуйте установить кодировку клиента специально для решения этой проблемы.