OpenBase SQL странности с учетом регистра ('=' против LIKE) - перенос на MySQL - PullRequest
3 голосов
/ 18 декабря 2008

Мы портируем приложение, которое раньше использовало Openbase 7, чтобы теперь использовать MySQL 5.0.

OB 7 имел довольно плохо определенное (то есть недокументированное) поведение в отношении чувствительности к регистру. Мы узнали об этом только сейчас, когда пытались выполнить те же запросы с MySQL.

Похоже, что OB 7 обрабатывает запросы с использованием "=" иначе, чем с использованием "LIKE": если у вас есть два значения "a" и "A" и выполняется запрос с WHERE f = "a", то он находит только поле «а», а не поле «А». Однако, если вы используете LIKE вместо «=», он находит оба.

Наши тесты с MySQL показали, что если мы используем недвоичное сопоставление (например, latin1), то и "=", и "LIKE" сравниваются без учета регистра. Однако, чтобы имитировать поведение OB, нам нужно получить только "=" с учетом регистра.

Сейчас мы пытаемся выяснить, как справиться с этим в MySQL, не добавляя много вызовов функции LOWER () ко всем нашим запросам (их много!).

Мы имеем полный контроль над БД MySQL, что означает, что мы можем выбирать режим сортировки по своему усмотрению (к счастью, наши имена таблиц и уникальные индексы не подвержены влиянию чувствительности к регистру).

Любые предложения, как имитировать поведение OpenBase на MySQL с наименьшим количеством изменений кода?

(я понимаю, что некоторые умные замены регулярных выражений в нашем исходном коде для добавления вызовов LOWER могут помочь, но мы бы предпочли найти другой способ)

Ответы [ 4 ]

2 голосов
/ 29 января 2009

Другая идея .. MySQL предлагает что-то вроде пользовательских функций? Затем вы можете написать UDF-версию подобного кода без учета регистра (ci_like или около того) и изменить все подобные значения на ci_like. Вероятно, это легче сделать, чем регулярное выражение для запроса на понижение в ..

0 голосов
/ 30 января 2009

Беглый взгляд на документы MySQL , кажется, показывает, что именно так MySQL делает это:

Это означает, что если вы ищете с col_name LIKE 'a%', вы получите все значения столбцов, которые начинаются с A или.

0 голосов
/ 28 января 2009

Я знаю, что это не тот ответ, который вы ищете ... но, учитывая, что вы хотите сохранить это поведение, разве вы не должны явно его кодировать (вместо того, чтобы где-то изменять какую-то волшебную «конфигурацию»)?

Вероятно, это довольно трудоемкая работа, но, по крайней мере, вы знаете , какие области вашего кода затронуты.

0 голосов
/ 18 декабря 2008

Эти две статьи говорят о чувствительности к регистру в mysql:

Оба были ранними хитами в этом поиске Google:

...