Как я могу запросить текст, содержащий символы азиатского языка в MySQL? - PullRequest
4 голосов
/ 19 февраля 2011

У меня есть таблица MySQL, использующая набор символов UTF-8 с одним столбцом с именем WORDS типа longtext.Значения в этом столбце вводятся пользователями и имеют длину несколько тысяч символов.

В этой таблице есть два типа строк:

  1. В некоторых строкахЗначение WORDS составлено носителями английского языка и содержит только символы, используемые в обычной английской письменности.(Не все обязательно ASCII, например, символ евро может появляться в некоторых случаях.)

  2. В других строках есть значения WORDS, написанные носителями азиатских языков (корейский,Китайский, японский и, возможно, другие), которые включают в себя смесь английских слов и слов на азиатских языках с использованием их родных логографических символов (а не, например, японских ромадзи).

Как я могу написать запрос, который будет возвращать все строки типа 2, а не строки типа 1?В качестве альтернативы, если это сложно, есть ли способ запросить большинство таких строк (здесь нормально, если я пропущу несколько строк типа 2 или добавлю несколько ложных срабатываний типа 1)?

Обновление: комментарии ниже предполагают, что я мог бы лучше избегать механизма запросов MySQL в целом, поскольку его поддержка регулярных выражений для юникода звучит не слишком хорошо.Если это правда, я мог бы извлечь данные в файл (используя mysql -B -e "some SQL here" > extract.txt), а затем использовать perl или аналогичный файл.Ответ с использованием этого метода будет в порядке (но не так хорош, как у MySQL!)

Ответы [ 2 ]

2 голосов
/ 19 февраля 2011

Теоретически вы можете сделать это:

  1. Найдите диапазоны Юникода, для которых вы хотите проверить.
  2. Вручную закодируйте начало и конец в UTF-8.
  3. Используйте первый байт каждого закодированного начала и конца в качестве диапазона для REGEXP.

Я считаю, что диапазон CJK достаточно далек от таких вещей, как символ евро, что ложных срабатываний и ложных отрицаний будет мало или их нет.

Редактировать: Теперь мы применили теорию на практике!

Шаг 1: Выберите диапазон символов. Я предлагаю \ u3000- \ u9fff; легко проверять и давать почти идеальные результаты.

Шаг 2: Кодировать в байты. (Wikipedia utf-8 page)

Для нашего выбранного диапазона кодированные значения utf-8 всегда будут составлять 3 байта, первое из которых - 1110xxxx, где xxxx - старшие четыре бита значения Юникода.

Таким образом, мы хотим обработать байты в диапазоне от 11100011 до 11101001 или от 0xe3 до 0xe9.

Шаг 3: Сделайте наше регулярное выражение, используя очень удобную (и только что обнаруженную мной) функцию UNHEX.

SELECT * FROM `mydata`
WHERE `words` REGEXP CONCAT('[',UNHEX('e3'),'-',UNHEX('e9'),']')

Только что попробовал. Работает как шарм. :)

0 голосов
/ 19 февраля 2011

Вы также можете использовать значение HEX символа.SELECT * FROM table WHERE <hex code>

Попробуйте с SELECT HEX(column) FROM table

Это также может помочь http://dev.mysql.com/doc/refman/5.0/en/faqs-cjk.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...