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