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.