Mysql Select с предложением LIKE не работает с китайскими иероглифами

У меня есть данные, хранящиеся в одном столбце на английском и китайском языках.

данные разделены разделителями, например. для китайского языка

<!--:zh-->日本<!--:-->

для английского

<!--:en-->English Characters<!--:-->

Я бы показывал контент в соответствии с выбранным пользователем языком.

Я сделал такой запрос

SELECT * FROM table WHERE content LIKE '<!--:zh-->%<!--:-->' 

Приведенный выше запрос работает, но возвращает пустой набор результатов.

Collation из content столбца равно utf8_general_ci

Я также пытался использовать функцию convert, как показано ниже.

SELECT * FROM table WHERE CONVERT(content USING utf8) 
                           LIKE CONVERT('<!--:zh-->%<!--:-->' USING utf8)

Но это тоже не работает.

Я также пытался выполнить запрос SET NAMES UTF8, но он все равно не работает.

Я выполняю запросы в PhpMyAdmin, если это имеет значение.


qTranslate не изменил базу данных, используемую WordPress. Данные перевода хранятся в исходных полях. По этой причине есть каждое поле, содержащее все переводы для этого специального поля, и данные выглядят так:

<!--:en-->English Characters<!--:--><!--:zh-->日本<!--:-->

http://wpml.org/documentation/related-projects/qtranslate-importer/


person Daric    schedule 21.11.2012    source источник
comment
Никогда не храните несколько данных в 1 столбце!   -  person juergen d    schedule 21.11.2012
comment
@juergend: он хранится в плагине Wordpress qTranslate   -  person Daric    schedule 11.12.2012
comment
Пожалуйста, опубликуйте свою таблицу - добавьте несколько операторов INSERT.   -  person Devart    schedule 11.12.2012


Ответы (6)


Данные тестовой таблицы для содержимого

<!--:zh-->日本<!--:--><!--:en-->English Characters<!--:-->
<!--:en-->English Characters<!--:--><!--:zh-->日本<!--:-->
<!--:zh-->日本<!--:-->
<!--:en-->English Characters<!--:-->

с последующим

У меня есть данные, хранящиеся в одном столбце на английском и китайском языках.

и ваш выбор должен выглядеть так

SELECT * FROM tab
WHERE content LIKE '%<!--:zh-->%<!--:-->%'

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

SET @PRE = '<!--:zh-->', @SUF = '<!--:-->';

SELECT
  content,
  SUBSTR( 
    content, 
    LOCATE( @PRE, content ) + LENGTH( @PRE ), 
    LOCATE( @SUF, content, LOCATE( @PRE, content ) ) - LOCATE( @PRE, content ) - LENGTH( @PRE ) 
  ) langcontent
FROM tab
WHERE content LIKE CONCAT( '%', @PRE, '%', @SUF, '%' );

как указано в документации MySQL, и следуйте пример

SELECT 'David!' LIKE '%D%v%';
person Sir Rufo    schedule 13.12.2012
comment
Вы совершенно правы. В операторе LIKE у ОП отсутствовала пара знаков процента. - person Panda Pajama; 18.12.2012

Как указывали другие, ваши запросы, похоже, в порядке, поэтому я бы поискал где-нибудь еще. Вот что вы можете попробовать:

Я не уверен насчет китайского ввода, но для японского многие символы имеют варианты полной и половинной ширины, например: «привет» и «hello» выглядят одинаково, но кодовые точки их символов разные, и поэтому выиграл сравниваю как равных. Очень легко ошибиться при наборе текста по всей ширине и очень трудно обнаружить, особенно пробелы. Сравните " " и " ".

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

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

person Panda Pajama    schedule 14.12.2012
comment
это не имеет ничего общего с тем, что вы упомянули, посмотрите на мой ответ и демонстрацию скрипта sql, а также на отредактированный вопрос. - person Sir Rufo; 18.12.2012
comment
Это было просто еще одно предложение по проблеме, которую я получаю все время. Извините, что вы нашли мой ответ таким плохим. - person Panda Pajama; 18.12.2012

Предполагая, что вы используете MySQL, вы можете использовать подстановочные знаки в LIKE:

  • % соответствует любому количеству символов, включая ноль символов.
  • _ соответствует ровно одному символу

Вот пример поиска значений, содержащих символ 日, в столбце content вашей таблицы:

SELECT * FROM table WHERE `content` LIKE '%日%'
person Anton    schedule 11.12.2012

Поиск не работает из-за того, как вы храните данные. Вы используете параметры сортировки utf8_general_ci, предназначенные для быстрого поиска на некоторых европейских языках. С некоторыми даже не все так идеально. Люди склонны использовать его только потому, что он быстрый и их не волнует какая-то неточность поиска, скажем, в скандинавских языках. Измените это значение на big5_chinese_ci или другое сопоставление, настроенное для китайского языка.

УПД. Еще одна вещь. Я вижу, вы используете своего рода разметку в своих записях БД.

<!--:zh-->日本<!--:-->
<!--:en-->English Characters<!--:-->

Итак, если вы ищете китайский язык, вы можете просто использовать

SELECT * FROM table WHERE content LIKE '<!--:zh-->%' 

вместо

SELECT * FROM table WHERE content LIKE '<!--:zh-->%<!--:-->' 
person Alexander Taver    schedule 17.12.2012
comment
если да, то почему это sqlfiddle.com/#!2/caf58/17/1 возвращает желаемый результат? - person Sir Rufo; 17.12.2012
comment
В какой кодировке/сопоставлении он хранит данные для таблицы и переменных? Если его конвертировать в ту же кодировку - нет проблем. Кстати, хороший инструмент. Спасибо, что показали мне это. - person Alexander Taver; 17.12.2012
comment
данные в поле записываются плагином wordpress и могут обрабатываться сами по себе. Таким образом, причиной отсутствия поиска является отсутствие % в начале и в конце. это все. sqlfiddle.com/#!2/ce202/2/1 Никто не предоставил это подсказка, и он не проверял это - person Sir Rufo; 17.12.2012
comment
Его образцы данных не похожи на те, которые вы используете в sqlfiddle. Вы объединили записи EN и ZH. - person Alexander Taver; 17.12.2012
comment
и вот в чем его дело. У меня есть данные, хранящиеся в одном столбце на английском и китайском языках. FAQ qTranslate qianqin.de/qtranslate/forum/viewtopic. php?f=3&t=3#p14 (последнее сообщение на странице) ;o) - person Sir Rufo; 17.12.2012
comment
Только что получил еще одну ссылку (немецкий), но вы можете посмотреть данные из одного поля drweb.de/magazin/ все объединены - person Sir Rufo; 17.12.2012

Я попытался воспроизвести проблему. Запрос в порядке, я получил результат, даже используя SET NAMES latin1.

Проверьте содержимое поля, возможно, есть начальные/конечные пробелы, сначала удалите их или попробуйте этот запрос -

SELECT * FROM table
WHERE TRIM(content) LIKE '<!--:zh-->%<!--:-->'

Пример с вашей строкой -

CREATE TABLE table1(
  column1 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci
);

INSERT INTO table1 VALUES
  ('<!--:en-->English Characters<!--:--><!--:zh-->日本<!--:-->');

SELECT * FROM table1 WHERE column1 LIKE '%<!--:zh-->%<!--:-->';

=>  <!--:en-->English Characters<!--:--><!--:zh-->日本<!--:-->
person Devart    schedule 11.12.2012
comment
Пробовал запрос, но безуспешно MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0051 sec ) - person Daric; 11.12.2012
comment
Можете ли вы показать некоторые строки из таблицы? Всего несколько операторов INSERT для воспроизведения. - person Devart; 11.12.2012

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

person Matzo    schedule 17.12.2012
comment
Это должен быть комментарий, а не ответ. - person 絢瀬絵里; 18.12.2012