Почему '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 семейство функций