2

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 上在相同的情况下创建数据库(datcollat​​e 和 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=t​​emplate0 进行创建,但在恢复时我收到错误消息,指出某些使用 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=
4

2 回答 2

1

发现了问题。出于某种原因,在服务器上我必须在 ts_query 上提供配置参数,在这种情况下,to_tsquery('portuguese', ...)

于 2016-08-11T14:30:25.800 回答
0

我的直接猜测是问题是client_encoding。我敢打赌它可以作为客户端在 Ubuntu 上运行,但不能在 Windows 上运行?在这种情况下,发生的事情是使用 1252 代码页对特殊字符进行编码,但在另一端被解释为 UTF8,导致它有效地查询错误的字符串。

尝试专门设置客户端编码来解决这个问题。

于 2016-08-11T11:15:25.903 回答