Почему «2»> «10»? - PullRequest
       37

Почему «2»> «10»?

20 голосов
/ 14 августа 2011

Почему '2' с начальным пробелом больше, чем '10'?

select ' 2' > '10';
 ?column? 
----------
 t
(1 row)

Я пробовал это с английскими сопоставлениями latin1 и utf8:

                                    List of databases
   Name    |   Owner    | Encoding  |    Collation     |      Ctype       |   Access privileges   
-----------+------------+-----------+------------------+------------------+-----------------------
 cpn       | cpn        | UTF8      | en_US.UTF-8      | en_US.UTF-8      | 
 teste     | cpn        | LATIN1    | en_US.ISO-8859-1 | en_US.ISO-8859-1 | 

Я знаю, что это связано с типом, потому что когда он приведен, он работает как ожидалось:*

teste=> select ' 2'::char > '10';
 ?column? 
----------
 f
(1 row)

Что именно здесь происходит?

РЕДАКТИРОВАТЬ:

Все вышеперечисленное было сделано с 8.4.8 в Fedora 13. Но я только что протестировалс 9,04 в Centos 6 с тем же результатом:

select ' 2' > '10';
 ?column? 
----------
 t
(1 row)

Список баз данных

   Name    |   Owner    | Encoding  |  Collation  |    Ctype    |   Access privileges   
-----------+------------+-----------+-------------+-------------+-----------------------
 cpn       | postgres   | UTF8      | en_US.UTF-8 | en_US.UTF-8 | 

Новое редактирование:

Это для дальнейшегопутать:

select ' ' > '1';
 ?column? 
----------
 f
(1 row)

Ответы [ 2 ]

5 голосов
/ 14 августа 2011

Я думаю, что PostgreSQL автоматически пытается определить тип за кулисами, а в Linux он пытается избавиться от '', некоторые сравнения также основаны на локали.

  • Таким образом, ' 2' > '10' становится '2'>'10', а сравнение составляет '2'>'1'; они не равны, поэтому нет необходимости продолжать с остальной строкой, и ascii('2') больше ascii('1'), поэтому оно имеет значение true.

  • Если бы это была операция равенства (например, '22' = '22 '), это привело бы к ложному результату, поскольку Postgres выполняет побайтовое сравнение. Это важно, потому что движок использует два разных алгоритма при сравнении.

  • Если вы укажете тип посредством приведения типов, он не будет переопределять правила пробела (' '=>'').


Также кредит предоставляется: RhodiumToad и Peerce в # postgresql

3 голосов
/ 14 августа 2011

Я думаю, что это связано с настройками локали.

Согласно Документы PostgreSQL: Поддержка локали :

Локальпараметры влияют на следующие функции SQL:

  • Порядок сортировки в запросах с использованием ORDER BY для текстовых данных
  • Возможность использовать индексы с предложениями LIKE
  • Верхняя, нижняя и initcap функции
  • Семейство функций to_char
...