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/

Ответ 1

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

<!--: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%';

Ответ 2

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

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

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

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

Ответ 3

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

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

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

SELECT * FROM table WHERE `content` LIKE '%日%'

Ответ 4

Я попытался воспроизвести проблему. Запрос в порядке, у меня есть результат, даже используя 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-->日本<!--:-->

Ответ 5

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

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

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

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

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

вместо

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

Ответ 6

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