2016-08-11 1 views
2

EDIT2: Я оставлю текст для контекстуализации, но я обнаружил, что проблема не имеет ничего общего с моими резервными копиями и моей моделью данных. Я сумел повторить эту проблему, выполнив следующие действия:Postgresql encoding and tsvector (Ubuntu)

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 используется «португальский», и я до сих пор не получают никаких результатов. Создание базы данных под теми же циклами (datcollate и datctype pt_PT.utf8, но без шаблона0) на моем ПК работает. проблема может быть шаблон0? если я попытаюсь сделать

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

Я получаю.

database creation failed: ERROR: new collation (pt_PT.utf8) is incompatible with the collation of the template database (en_US.UTF-8) HINT: Use the same collation as in the template database, or use template0 as template.

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


Прежде всего, я уже искал и у меня есть некоторые идеи, я просто нужна помощь, так как я не знаком с PostgreSQL и Ubuntu. Для установки у меня есть мой компьютер (с обоими окнами и Linux15.10) и удаленный ПК, который обслуживает сервер aa (с 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'; 

НА WINDOWS:

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 is < => WIN1252, который, насколько я помню, является «подобным» «подтипу» (я не знаю здесь sintax) UTF8. Поскольку он работает с этой кодировкой и pt_PT.utf8, может ли проблема быть на en_US.UTF-8?Я попытался создать с кодировкой «LATIN1» и TEMPLATE = template0, но при восстановлении я получил сообщение о том, что некоторый специальный символ с кодировкой UTF8 не имел «перевода» в LATIN1. Что меня смущает, так это то, что строки возвращаются с правильными символами, такими как à, ê и т. Д. И т. Д., Но это не удается при поиске.

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

Действительно оценен!

EDIT: Я создал новую базу данных только для тестирования и получил это:

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= 

ответ

0

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

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

+0

Благодарим вас за ответ @Chris. Я тоже подумал об этом. Я изменил клиент, я сделал \ encoding для разных вариантов кодирования, но не повезло. Если вы можете, проверьте мое редактирование –

1

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

+0

Это тоже может случиться. :-) –

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