Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在名称上选择具有不一致的行为_Postgresql - Fatal编程技术网

Postgresql 在名称上选择具有不一致的行为

Postgresql 在名称上选择具有不一致的行为,postgresql,Postgresql,我在英国的地方当局和地区有一个PostgreSQL数据库。加载到Postgres时,我修剪了名称。如果我在一个表中搜索,我只会得到一个精确字符串的匹配,但是如果我在另一个表中搜索,我会得到一个精确字符串的匹配,以及尾随空格的匹配。这是相同的匹配,正如您通过相同的regionid主键和最后一次使用LIKE的查询所看到的。以下是psql中的输出: 我正在Azure上使用以下版本运行Postgres: db=> SELECT version();

我在英国的地方当局和地区有一个PostgreSQL数据库。加载到Postgres时,我修剪了名称。如果我在一个表中搜索,我只会得到一个精确字符串的匹配,但是如果我在另一个表中搜索,我会得到一个精确字符串的匹配,以及尾随空格的匹配。这是相同的匹配,正如您通过相同的regionid主键和最后一次使用LIKE的查询所看到的。以下是psql中的输出:

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

发生了什么?

这些表之间的区别是la.name是varchar50,而region.name是char24。char与varchar的不同之处在于尾部空格被忽略。引述:

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


您能为这两个表添加模式吗?是的,我这样做了。一个有性格,另一个性格多变。所以第一个是自动填充的。是的,这是我的猜测。这就是他们行为不同的原因。干得好。我发现:字符类型的值在物理上用空格填充到指定的宽度n,并以这种方式存储和显示。但是,在比较character类型的两个值时,尾随空格被视为语义上不重要的,并且被忽略。你想写一个答案吗?简而言之:不要使用char或character数据类型。它们只是出于历史原因而存在。
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 |