Почему '2'> '10'?

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

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

я попробовал его с латинскими и 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)

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

EDIT:

все вышеперечисленное было сделано с 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 ответов


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

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

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

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


также заслуга: RhodiumToad и Peerce в #postgresql


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

по данным документы PostgreSQL: поддержка языкового стандарта:

настройки локали влияют на следующие функции SQL:

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