2012-06-11 2 views
2

У меня есть таблица с арабским текстом. Есть два уникальных строк:Арабский текст несколько результатов

اس
اس

Первый состоит из следующих символов:             0x0627, 0x0650, 0x0633
Второй состоит из следующих символов: 0x0627 , 0x064F, 0x0633

Проблема в том, что если я запрошу любой из них, они оба появятся. Это происходит как в командной строке, так и с использованием phpmyadmin. Вот что я набираю для запроса:

SET NAMES utf8;
SELECT urdu ИЗ транслитерации WHERE urdu LIKE 'اس';

Любые мысли?

+1

Является ли ваш набор настроек 'utf8_bin'? В противном случае MySQL, вероятно, увидит их как одни и те же символы, потому что они просто разные оболочки одного и того же символа. – Esailija

ответ

2

Это возвращение обеих строк является функцией (полезной функцией!) MySQL: операторы SELECT могут быть нечувствительны к случаю или длине символов гласных. Эта функция называется сортировкой. utf_unicode_ci - это, вероятно, сортировка в столбце urdu.

Но вы можете контролировать это в своем предложении WHERE, если вам нужно.

WHERE COLLATE utf_bin urdu = 'اِس' 

(Пожалуйста, простите меня, если я подогнаны свой арабский,. Я не знаю этого языка)

Но, пожалуйста, считают, что MySQL уже может давать соответствующие результаты для вашего приложения, как только вы закончите отладку и поставить его в производство.

Обратите внимание, что вам не нужно использовать LIKE, если вы не надеетесь на частичное совпадение.

+0

Вы совершенно правы. Я только заметил, что я никогда не отвечал на это, но это был ответ (более года назад) :-) – theglossy1

0

Вы ищете одно и то же слово, у одного есть короткий гласный, а другой нет. Поскольку короткие гласные необязательны, вы можете использовать обе версии. Теперь MySQL кажется достаточно умным, чтобы отбросить гласные и вернуть вам ту же запись. Возможно, вам нужно отбросить аргумент LIKE из вашего запроса, потому что обе версии одинаковы.

Если вы хотите избежать этой проблемы, переместите ваши записи в db из всех коротких гласных и сохраните исходное слово во второй строке. Затем вы также можете удалить все ваши запросы и выполнить поиск идентичных записей.

+0

Это не вещь 'LIKE', это сортировка. –

0

Попробуйте это:

SELECT urdu FROM transliteration WHERE urdu LIKE 'اِس' collate utf8_bin 

Или, скорее добавить collate utf8_bin в конце вашего кода, я не уверен, что я получил символы правильно.

Смежные вопросы