Упорядочение нелатинских символов в базе данных с помощью «order by» - PullRequest
4 голосов
/ 25 марта 2010

Я только что обнаружил странное поведение предложения базы данных "упорядочить по". При сравнении строк я ожидал, что некоторые символы, такие как «[» и «_», будут больше латинских символов / цифр, таких как «I» или «2», учитывая их порядок в таблице ASCII. Однако результаты сортировки из предложения "order by" базы данных отличаются от моих ожиданий. Вот мой тест:

SQLite версии 3.6.23
Введите ".help" для получения инструкций
Введите операторы SQL, оканчивающиеся на «;»
sqlite> создать таблицу продуктов (имя varchar (10));
sqlite> вставить в значения продуктов ('ipod');
sqlite> вставить в значения товаров ('iphone');
sqlite> вставить в значения продуктов ('[apple]');
sqlite> вставить в значения товаров ('_ ipad');
sqlite> выберите * из списка продуктов по названию asc;
[Яблоко]
_ipad
iphone
Сделать ставку

select * from products order by name asc;
name
...
[B@
_ref
123
1ab
...

Это поведение отличается от сравнения строк в Java (которое стоило мне времени, чтобы найти эту проблему). Я могу проверить это в как SQLite 3.6.23, так и Microsoft SQL Server 2005. Я выполнил поиск в Интернете, но не могу найти соответствующую документацию. Может ли кто-нибудь пролить мне свет на это? Это стандарт SQL? Где я могу найти информацию об этом? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 25 марта 2010

Концепция сравнения и упорядочения символов в базе данных называется сопоставление .

Способ хранения строк зависит от параметров сортировки, которые обычно устанавливаются в свойствах сервера, клиента или сеанса.

В MySQL:

SELECT  *
FROM    (
        SELECT  'a' AS str
        UNION ALL
        SELECT  'A' AS str
        UNION ALL
        SELECT  'b' AS str
        UNION ALL
        SELECT  'B' AS str
        ) q
ORDER BY
        str COLLATE UTF8_BIN


--
'A'
'B'
'a'
'b'

и

SELECT  *
FROM    (
        SELECT  'a' AS str
        UNION ALL
        SELECT  'A' AS str
        UNION ALL
        SELECT  'b' AS str
        UNION ALL
        SELECT  'B' AS str
        ) q
ORDER BY
        str COLLATE UTF8_GENERAL_CI


--
'a'
'A'
'b'
'B'

UTF8_BIN сортирует символы в соответствии с их юникодом. Заглавные буквы имеют более низкий юникод и поэтому идут первыми.

UTF8_GENERAL_CI сортирует символы по алфавиту, без учета регистра.

Сортировка также важна для индексов, поскольку индексы сильно зависят от правил сортировки и сравнения.

1 голос
/ 25 марта 2010

Важное ключевое слово в этом случае - 'collation' . У меня нет опыта работы с SQLite, но я ожидаю, что он будет аналогичен другим ядрам баз данных, поскольку вы можете определить параметры сортировки, которые будут использоваться для целых баз данных, отдельных таблиц, для каждого соединения и т. Д.

Проверьте документацию БД на предмет доступных вам опций.

0 голосов
/ 25 марта 2010

ASCII-коды для строчных букв, таких как «i», больше, чем для «[» и «_»:

'i': 105
'[': 91
'_': 95

Однако попробуйте вставить заглавные буквы, например. попробуйте с "IPOD" или "Iphone", они станут перед "_" и "[" с двоичным сопоставлением по умолчанию.

...