MySQL запрос с как% ..% в предложении, где возвращаются разные результаты - PullRequest
1 голос
/ 15 июня 2009

У меня следующая проблема (при использовании mysql 5.0.70).

В одной таблице у меня есть поле varchar, содержащее какое-то число, например:

"0303A342", "21534463", "35663CE3"

и т.д.. Сортировка установлена ​​на utf8_general_ci.

Проблема появляется, когда пользователь системы пытается найти запись, содержащую часть этого номера. SQL-запрос выглядит как

...
WHERE 'number' LIKE '%0303A%'

Теперь, если 'A' в части LIKE введено как Latin A, результат содержит только записи с Latin A в них - как и должно быть. И когда A равно Cyrillic, результатом снова будут только те строки, которые содержат Cyrillic A. Есть много других букв, таких как E, C, B, T и т. Д.

Теперь мой вопрос: есть ли способ изменить мой sql-запрос, чтобы он возвращал все строки, соответствующие части LIKE '%0303A%', но для всех видов A? Или я должен преобразовать пользовательский ввод перед вставкой / обновлением базы данных?

Ответы [ 3 ]

1 голос
/ 15 июня 2009

Вы должны конвертировать пользовательский ввод, нет функции LOOKS LIKE в MySQL:)

Вы можете сохранить транслитерированную строку вместе с исходной и использовать php :: translit для этого:

id data    trans_data
1  Москва  MOSKVA
2  София   SOFIA
SELECT  *
FROM    table
WHERE   trans_data LIKE CONCAT('%', ?, '%')

mysqli->bind_param('s', strtoupper(transliterate('Москва')));
0 голосов
/ 19 июня 2009

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

0 голосов
/ 15 июня 2009

Тот факт, что некоторые буквы выглядят одинаково в нескольких алфавитах, не делает их идентичными. На самом деле их внешность может даже зависеть от шрифта, используемого для их отображения.

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

Если нет, вы можете найти функции, аналогичные описанным Quassnoi (транслитерат ()) на языке или библиотеке, которую вы используете. С простым MySQL вам, вероятно, не повезло. И даже если вы найдете какую-то функцию, которая делает то, что вы хотите, убедитесь, что она поддерживает все языки / алфавиты, которые будут использовать ваши пользователи - я бы, например, не знал, сколько существует алфавитов, которые имеют соотношения 1: 1 своих символов в латинские.

...