Я работаю с базой данных MySQL, в которой есть данные, импортированные из Excel . Данные содержат символы, отличные от ASCII (длинное тире и т. Д.), А также скрытые символы возврата каретки или перевода строки. Есть ли способ найти эти записи с помощью MySQL?
mysql
character-encoding
Эд Мэйс
источник
источник
Ответы:
Это зависит именно от того, что вы определяете как «ASCII», но я бы посоветовал попробовать такой вариант запроса:
Этот запрос вернет все строки, в которых columnToCheck содержит любые символы, отличные от буквенно-цифровых. Если у вас есть другие допустимые символы, добавьте их в класс символов в регулярном выражении. Например, если точки, запятые и дефисы допустимы, измените запрос на:
Наиболее актуальной страницей документации MySQL, вероятно, является 12.5.2 Регулярные выражения .
источник
SELECT * FROM tbl WHERE colname NOT REGEXP '^[A-Za-z0-9\.,@&\(\) \-]*$';
MySQL обеспечивает комплексное управление набором символов, которое может помочь в решении такого рода проблем.
CONVERT(col USING charset)
Функция превращает unconvertable символов в замене символов. Тогда преобразованный и непреобразованный текст будут неравными.См. Это для более подробного обсуждения. https://dev.mysql.com/doc/refman/8.0/en/charset-repertoire.html
Вы можете использовать любое имя набора символов вместо ASCII. Например, если вы хотите узнать, какие символы некорректно отображаются на кодовой странице 1257 (литовский, латышский, эстонский), используйте
CONVERT(columnToCheck USING cp1257)
источник
Вы можете определить ASCII как все символы с десятичным значением от 0 до 127 (0x00 - 0x7F) и найти столбцы с символами, отличными от ASCII, используя следующий запрос
Это был самый исчерпывающий вопрос, который я мог придумать.
источник
SELECT * FROM table WHERE LENGTH( column ) != CHAR_LENGTH( column )
'ā'
(закодированный последовательностью байтов0x0101
) - он будет считаться «ASCII» с помощью этого теста: ложноотрицательный ; на самом деле, некоторые наборы символов не закодировать символы ASCII в0x00
в результате0x7f
чего это решение дало бы ложноположительный. НЕ ДОВЕРЯЙТЕ НА ЭТОТ ОТВЕТ!LENGTH(column)
будут постоянно кратнымиCHAR_LENGTH(column)
независимо от значения.Вероятно, это то, что вы ищете:
Он должен возвращать все строки, в которых COLUMN содержит символы, отличные от ASCII (или непечатаемые символы ASCII, такие как новая строка).
источник
REGEXP
иRLIKE
работают побайтно, поэтому они не являются многобайтовыми и могут давать неожиданные результаты с многобайтовыми наборами символов. Кроме того, эти операторы сравнивают символы по их байтовым значениям и символы с диакритическими знаками не могут сравниваться как равные, даже если данное сопоставление рассматривает их как равные. "Во всех приведенных выше примерах отсутствует один символ завершения (\ 0). Это невидимо для вывода консоли MySQL и не может быть обнаружено ни одним из вышеупомянутых запросов. Запрос на его поиск очень простой:
источник
Основываясь на правильном ответе, но с учетом управляющих символов ASCII, решение, которое сработало для меня, таково:
Он делает то же самое: ищет нарушения диапазона ASCII в столбце, но позволяет вам также искать управляющие символы, поскольку он использует шестнадцатеричную нотацию для кодовых точек. Поскольку нет сравнения или преобразования (в отличие от ответа @Ollie), это тоже должно быть значительно быстрее. (Особенно, если MySQL выполняет раннее завершение запроса регулярного выражения, что определенно должно быть.)
Это также позволяет избежать возврата полей нулевой длины. Если вам нужна немного более длинная версия, которая может работать лучше, вы можете использовать вместо этого:
Он выполняет отдельную проверку длины, чтобы избежать результатов с нулевой длиной, не учитывая их для прохода регулярного выражения. В зависимости от количества имеющихся записей нулевой длины это может быть значительно быстрее.
Обратите внимание: если ваш набор символов по умолчанию является чем-то странным, где 0x00-0xFF не соответствует тем же значениям, что и ASCII (существует ли где-нибудь такой набор символов?), Это вернет ложное срабатывание. В противном случае наслаждайтесь!
источник
REGEXP
и проверяются. Следовательно, всегда соответствие гарантировано. Также^$
, вероятно, это не то, что вы хотели.Попробуйте использовать этот запрос для поиска записей специальных символов
источник
Ответ @zende был единственным, который охватывал столбцы со смесью символов ascii и не ascii, но также имел эту проблемную шестнадцатеричную вещь. Я использовал это:
источник
В Oracle мы можем использовать ниже.
источник
для этого вопроса мы также можем использовать этот метод:
Вопрос от sql zoo:
Найдите все подробности приза, выигранного ПИТЕРОМ ГРЮНБЕРГОМ
Не-ASCII символы
ans: выберите * from nobel, где победитель вроде "P% GR% _% berg";
источник