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=
Благодарим вас за ответ @Chris. Я тоже подумал об этом. Я изменил клиент, я сделал \ encoding для разных вариантов кодирования, но не повезло. Если вы можете, проверьте мое редактирование –