选择名称时行为不一致

时间:2018-10-23 11:31:07

标签: postgresql

我在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 | 

这是怎么回事?

1 个答案:

答案 0 :(得分:1)

这些表之间的区别在于la.namevarchar(50),而region.namechar(24)charvarchar的不同之处在于尾随空格被忽略。引用docs

  

character类型的值在物理上用空格填充到指定的宽度n,并以这种方式存储和显示。但是,比较两个字符类型的值时,尾随空格在语义上是微不足道的,并且被忽略。