Выбор по именам имеет противоречивое поведение - PullRequest
0 голосов
/ 23 октября 2018

У меня есть база данных в 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)

Я запускаю Postgres на Azure с этой версией:

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 голосов
/ 23 октября 2018

Разница между этими таблицами заключается в том, что la.name равно varchar(50), а region.name равно char(24).char отличается от varchar тем, что завершающие пробелы игнорируются.Чтобы процитировать docs :

Значения типа символ физически дополняются пробелами до указанной ширины n, и сохраняются и отображаются таким образом.Однако конечные пробелы обрабатываются как семантически несущественные и не учитываются при сравнении двух значений типа символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...