EDIT2:我将保留其余文本以进行上下文化,但我发现问题与我的备份或数据模型无关。我已经成功地复制了以下问题:
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 上使用了“葡萄牙语”,但我仍然没有得到任何结果。在我的 PC 上在相同的情况下创建数据库(datcollate 和 datctype pt_PT.utf8,但没有 template0)它可以工作。问题可以是template0吗?如果我尝试做
createdb localeTestDb -E UTF8 --locale=pt_PT.utf8
我明白了。
数据库创建失败:错误:新排序规则 (pt_PT.utf8) 与模板数据库 (en_US.UTF-8) 的排序规则不兼容提示:使用与模板数据库中相同的排序规则,或使用 template0 作为模板。
我认为它与编码和 tsvector 有关......我只是不知道是什么。
首先,我已经搜索过并且我有一些想法,我只是需要一些帮助,因为我对 postgresql 和 Ubuntu 不太熟悉。对于设置,我有我的 PC(带有 Windows 和 Linux15.10)和一个远程 PC,它为服务器提供服务(带有 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 是 <=> 到 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=