Как я могу проверить, является ли двоичная строка UTF-8 в MySQL? - PullRequest
4 голосов
/ 04 февраля 2010

Я нашел регулярное выражение Perl, которое может проверить, является ли строка UTF-8 (регулярное выражение взято с w3c site ).

$field =~
  m/\A(
     [\x09\x0A\x0D\x20-\x7E]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;

Но я не уверен, как перенести его на MySQL, так как кажется, что MySQL не поддерживает шестнадцатеричное представление символов. См. этот вопрос .

Есть мысли, как перенести регулярное выражение на MySQL? Или, может быть, вы знаете какой-либо другой способ проверить, является ли строка допустимой UTF-8?

UPDATE: Мне нужна эта проверка, работающая на MySQL, так как мне нужно запустить ее на сервере, чтобы исправить поврежденные таблицы. Я не могу передать данные через скрипт, так как база данных составляет около 1 ТБ.

Ответы [ 2 ]

3 голосов
/ 14 марта 2010

Мне удалось восстановить базу данных с помощью теста, который работает только в том случае, если ваши данные могут быть представлены с использованием однобайтовой кодировки, в моем случае это был латиноамериканский номер.mysql изменяет байты, которые не являются utf-8, на '?'при конвертации в латиницу 1.

Вот как выглядит проверка:

SELECT (
         CONVERT(
           CONVERT(
              potentially_broken_column 
           USING latin1) 
         USING utf8))
       != 
       potentially_broken_column) AS INVALID ....
0 голосов
/ 04 февраля 2010

Если вы контролируете как входную, так и выходную стороны этой БД, тогда вы должны быть в состоянии проверить, что ваши данные имеют формат UTF-8 на любой стороне, которая вам нравится, и применить ограничения по мере необходимости.Если вы имеете дело с системой, в которой вы не контролируете входную сторону, то вам придется проверить ее после того, как вы вытащите ее и, возможно, конвертировать на выбранном вами языке (Perl это звучит как).

База данных - ДЕЙСТВИТЕЛЬНО хорошее хранилище, но ее не следует активно использовать для других приложений.Я думаю, что это единственное место, где вы должны просто позволить MySQL хранить данные до тех пор, пока вам не понадобится что-то делать с ними дальше.

Если вы хотите продолжить путь, по которому вы идете, то посмотрите страницу руководства MySQL.: http://dev.mysql.com/doc/refman/5.0/en/regexp.html

Как правило, REGEX ОЧЕНЬ похож на языки (на самом деле я почти всегда могу копировать между JavaScript, PHP и Perl с незначительными изменениями для их функций переноса), так что если это работает с REGEX, то вам следуетлегко переносить его.

GL!

РЕДАКТИРОВАТЬ: посмотрите на эту статью о стеке - вы можете использовать хранимые процедуры, учитывая, что вы не можете использовать скрипты для обработки данных: Регулярные выражения в хранимых процедурах

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

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