|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Ariochdimitr, на мой взгляд нужно проталкивать вместе с коллейтом когда ты сравниваешь signed int 32 и unsigned int 32 ты оба расширяешь до int 64, например с чарсетами и коллейтами должно происходить аналогичное приведение к некоему общему надмножеству вот здесь ты не прав. Коллейт это в том числе и правила сравнения, нельзя их менять. AriochА почему нельзя? я не сказал что нельзя, я сказал что это криво. Есть хорошие практики, есть плохие. Те кто используют хорошие обычно на такие вещи не попадают. Но это конечно не отменяет что вышеописанный пример является багом. Можешь в трекер бежать ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:23 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, В принципе, может и не существовать. Но - UNICODE же... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:23 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Симонов ДенисКоллейт это в том числе и правила сравнения, нельзя их менять. Вот именно! И когда оптимизатор проталкивает LIKE с потерей коллейта, а потом берёт дефолтный коллейт у ДРУГОГО столбца, чем был в оригинале - он и теряет исходные "правила сравнения". И отсюда возникает "общий", "идеальный" вопрос, когда вообще вычисляется выражение "field_1 = field_2" - и у этих полей разные чарсеты и/или коллейты, какой чарсет и коллейт в таком случае используется в самой операции сравнения? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:29 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
AriochВ принципе, может и не существовать. Но - UNICODE же...Юникод не делает сравнимыми русский алфавит ни с немецким, ни даже с болгарским. Хочется сравнивать строки любых языков - не выёживаемся и вообще не указываем сортировку. Будет unicode_binary или как его там. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:35 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
AriochИ отсюда возникает "общий", "идеальный" вопрос, когда вообще вычисляется выражение "field_1 = field_2" - и у этих полей разные чарсеты и/или коллейты, какой чарсет и коллейт в таком случае используется в самой операции сравнения? любой из них. Хотя мне кажется, надо ошибку кидать. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:35 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Условно - это примерно как консистентность БД. Не факт, что данные в БД соответсвуют реальному миру, но они должны быть взаимно-согласованы внутри БД. предикат "LIKE-2" - это функция, созданная на основе двух других функций: сравнения на равенство и LIKE-1 вот внутри самой себя эта процедура создания новой функции-предиката из двух существовавших должна быть внутренне консистентной. т.е. LIKE-2 должна наследовать чарсет и коллейт у обоих функций (сравнения на равенство и LIKE-1). это можно сделать, если возможно определить "надмножество", каким угодно образом, но одинаковым. но если "надмножества" не существует, как Сидоров предлагает, то тогда и выражение "сравнение на равенство" нельзя вычислить вообще? и весь SELECT просто не имеет смысла? Если же это выражение вычисляется - каким угодно образом, может быть неправильным для "реального мира" но внутренне-консистентном внутри модели БД - то значит мы определили что такое "надмножество" и можем его же передать в функцию LIKE-2 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:35 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
"Магия данных" может приводить к странным результатам и это - не проблема СУБД. Ошибки проектирования приводят к ещё более странным результатам и это, тем более, не проблема СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:37 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Basil A. Sidorovсравнимыми русский алфавит ни с немецким, ни даже с болгарским смотря какое. На больше-меньше вероятно не имеет смысла. А вот на равно/неравно - вполне. это как комплексные числа, упорядочить их нельзя, а сравнить на равенство можно dimitrлюбой из них. Хотя мне кажется, надо ошибку кидать. Любой наугад? в каком порядке relations вошли - "кто первый встал того и тапки" ? Tо есть получается "угадайка" своего рода ? :-( ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:38 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Basil A. Sidorov"Магия данных" может приводить к странным результатам и это - не проблема СУБД. результат может быть странным, но он должен быть внутренне согласован иначе получаем "тут играем, тут не играем, тут рыбу заворачиваем" ладно, в любом случае, это баг оптимизатора, а до какой степени его можно исправить не отключая функциональность вообще - это "снаружи" не видно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:40 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Ariochсмотря какое. На больше-меньше вероятно не имеет смысла. А вот на равно/неравно - вполне.Бинарное сравнение - да, имеет смысл. Алфавитное - уже "далеко не всегда" или "почти никогда" не имеет смысла. Задав разные правила сравнения по разные стороны знака равенства вы ступили на скользкий путь неопределённого поведения. С моей кочки зрения - человек сам себя перехитрил, но ему очень не хочется признавать собственную ошибку. P.S. Нет, SO я не читал. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:43 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
AriochЛюбой наугад? в каком порядке relations вошли - "кто первый встал того и тапки" ? Tо есть получается "угадайка" своего рода ? :-( не совсем. Но в общем случае можно сказать что результат не определён. В случае left join как раз понятно кто с кем сравнивается. З.Ы. Запрос в пример надо было переделать на явное указание collate при сравнении такой чтобы он был одинаков с обоих сторон. Тут может потеряться работа с индексом, но это лучше рулить уже через другие вещи, например научить выполнять LEFT JOIN через HASH JOIN ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:50 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 16:00 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Симонов ДенисЗапрос в пример надо было переделать на явное указание collate при сравнении Тут тоже немножечко криво. Насколько я понимаю логику SQL, то коллейт - это атрибут не операции (сравнения, конкатенация и т.д.), а самих данных. т.е. нельзя написать .....where field_X LIKE collate CCC field_Y или .....where field_X = collate CCC field_Y зато можно писать .....where field_X collate C_1 LIKE field_Y collate C_2 в нашем частном случае, я предполагаю, у строкового литерала вообще нет никакого коллейта, и он его неявно получает от другого операнда. как во многих языках у const X = Y / 1 - единица возьмёт себе тип от Y. но вот если бы в исходном запросе был НЕ ЛИТЕРАЛ, то что делать тогда ? Если бы в исходном запросе было не Код: sql 1.
а например Код: sql 1.
тогда бы collate был уже по обе стороны от LIKE и что делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 16:14 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Ariochтогда бы collate был уже по обе стороны от LIKE и что делать?CAST ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 16:26 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
...и вот к вопросу о литералах... AriochAriochесть предикат (T_CS.id collate UNICODE like '%bc%') а есть другой предикат (T_CS.id collate UNICODE_CI like '%bc%') Бинго! Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
А вот это я уже не млогу объяснить.... Итак, литералы... Database Connection у меня в win1251 Код: sql 1. 2. 3.
Здесь у нас привычный баг, данный только из одной таблицы. Код: sql 1. 2. 3.
Тут мы привычно "прибили гвоздиками" case-insensitive коллейшн к сравнению и получили данные из обеих таблиц. Как и раньше. Осталось "прибить гвоздиком" case-sensitive и не получить ни одной строки, так? Код: sql 1. 2. 3.
Код: plaintext 1. 2. 3.
Оппаньки! Перепроверяем сразу же! Код: sql 1. 2. 3.
.....выборка пустая. Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 16:42 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Arioch, а про условие соединения ты конечно же забыл ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 17:09 |
|
FB3, join vs LIKE vs case-sensitivity
|
|||
---|---|---|---|
#18+
Симонов Денис, объясни подробно, как это условие должно было тут влиять и проводить к разным результатам (слева или справа от LIKE): - теоретически, на уровне SQL. - и практически, на уровне реализации. повторяю, что само сравнение(условие соединения) ВСЕГДА выдает true при ЛЮБОМ collation ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 17:25 |
|
|
start [/forum/topic.php?fid=40&msg=39833415&tid=1560670]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
140ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 246ms |
0 / 0 |