Странности с чувствительностью к регистру в Openbase SQL ('=' противНРАВИТСЯ) - перенос на MySQL

StackOverflow https://stackoverflow.com/questions/377664

Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

В этих двух статьях рассказывается о чувствительности к регистру в mysql:

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

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

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

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

Это означает, что если вы выполните поиск с помощью col_name, НАПРИМЕР 'a%', вы получите значения всех столбцов, которые начинаются с A или a.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top