我在PostgreSQL中有一个数据库,其中包含英国的地方政府和地区。加载到Postgres中时,我修剪了名字。如果我在一个表中进行搜索,则仅与确切的字符串匹配,但是如果我在另一表中进行搜索,则将得到与确切的字符串以及尾随空格的匹配。这是相同的匹配,就像您通过相同的regionid
主键和使用LIKE
的最后一个查询所看到的一样。这是psql
中的输出:
db=> select * from la where name = 'Rutland';
lau1 | name | regionid
-----------+---------+----------
E06000017 | Rutland | 4
(1 row)
db=> select * from la where name = 'Rutland ';
lau1 | name | regionid
------+------+----------
(0 rows)
db=> select * from region where name = 'West Midlands';
regionid | name
----------+--------------------------
5 | West Midlands
(1 row)
db=> select * from region where name = 'West Midlands ';
regionid | name
----------+--------------------------
5 | West Midlands
(1 row)
db=> select * from region where name like 'West Midland%';
regionid | name
----------+--------------------------
5 | West Midlands
(1 row)
我正在此版本的Azure上运行Postgres:
db=> SELECT version();
version
------------------------------------------------------------
PostgreSQL 10.5, compiled by Visual C++ build 1800, 64-bit
(1 row)
更新:模式为:
db=> \d la
Table "public.la"
Column | Type | Collation | Nullable | Default
----------+-----------------------+-----------+----------+---------
lau1 | character(9) | | not null |
name | character varying(50) | | not null |
regionid | integer | | not null |
dbr=> \d region
Table "public.region"
Column | Type | Collation | Nullable | Default
----------+---------------+-----------+----------+---------
regionid | smallint | | not null |
name | character(24) | | not null |
这是怎么回事?
答案 0 :(得分:1)
这些表之间的区别在于la.name
是varchar(50)
,而region.name
是char(24)
。 char
与varchar
的不同之处在于尾随空格被忽略。引用docs:
character类型的值在物理上用空格填充到指定的宽度n,并以这种方式存储和显示。但是,比较两个字符类型的值时,尾随空格在语义上是微不足道的,并且被忽略。