Как я могу найти не-ASCII символы в MySQL? - PullRequest
109 голосов
/ 31 декабря 2008

Я работаю с базой данных MySQL, в которой есть некоторые данные, импортированные из Excel . Данные содержат символы не ASCII (тире и т. Д.), А также скрытые символы возврата каретки или перевода строки. Есть ли способ найти эти записи с помощью MySQL?

Ответы [ 10 ]

192 голосов
/ 31 июля 2012

MySQL обеспечивает комплексное управление наборами символов, которое может помочь в решении подобных проблем.

SELECT whatever
  FROM tableName 
 WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)

Функция CONVERT(col USING charset) превращает необратимые символы в замещающие символы. Тогда преобразованный и не преобразованный текст будет неравным.

Смотрите это для дальнейшего обсуждения. https://dev.mysql.com/doc/refman/8.0/en/charset-repertoire.html

Вы можете использовать любое имя набора символов вместо ASCII. Например, если вы хотите узнать, какие символы не будут правильно отображаться на кодовой странице 1257 (литовский, латышский, эстонский), используйте CONVERT(columnToCheck USING cp1257)

91 голосов
/ 10 августа 2009

Вы можете определить ASCII как все символы с десятичным значением от 0 до 127 (0x00 - 0x7F) и найти столбцы с не-ASCII символами, используя следующий запрос

SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';

Это был самый полный запрос, который я мог придумать.

55 голосов
/ 31 декабря 2008

Это в точности зависит от того, что вы определяете как «ASCII», но я бы предложил попробовать вариант запроса, подобный этому:

SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9]';

Этот запрос вернет все строки, где columnToCheck содержит любые не алфавитно-цифровые символы. Если у вас есть другие допустимые символы, добавьте их в класс символов в регулярном выражении. Например, если точки, запятые и дефисы в порядке, измените запрос на:

SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9.,-]';

Наиболее релевантная страница документации MySQL, вероятно, 12.5.2 Регулярные выражения .

41 голосов
/ 12 марта 2009

Это, вероятно, то, что вы ищете:

select * from TABLE where COLUMN regexp '[^ -~]';

Он должен возвращать все строки, где COLUMN содержит символы не ASCII (или непечатные символы ASCII, такие как символ новой строки).

13 голосов
/ 27 августа 2013

Одним из пропущенных символов в приведенных выше примерах является символ завершения (\ 0). Это невидимо для вывода на консоль MySQL и не может быть обнаружено ни одним из упомянутых выше запросов. Запрос, чтобы найти это просто:

select * from TABLE where COLUMN like '%\0%';
2 голосов
/ 05 января 2016

Основываясь на правильном ответе, но также принимая во внимание управляющие символы ASCII, решение, которое сработало для меня, таково:

SELECT * FROM `table` WHERE NOT `field` REGEXP  "[\\x00-\\xFF]|^$";

Он делает то же самое: ищет нарушения диапазона ASCII в столбце, но позволяет также искать управляющие символы, поскольку он использует шестнадцатеричные обозначения для кодовых точек. Поскольку нет сравнения или преобразования (в отличие от ответа @ Ollie), это также должно быть значительно быстрее. (Особенно, если MySQL досрочно завершает запрос регулярного выражения, что он определенно должен делать.)

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

SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP  "[\\x00-\\xFF]";

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

Обратите внимание, что если ваш набор символов по умолчанию является чем-то странным, когда 0x00-0xFF не сопоставляются с теми же значениями, что и ASCII (такой набор символов существует где-нибудь?), Это вернет ложный положительный результат. В противном случае наслаждайтесь!

0 голосов
/ 28 февраля 2019

В Oracle мы можем использовать ниже.

SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;
0 голосов
/ 25 марта 2018

для этого вопроса мы также можем использовать этот метод:

Вопрос из sql zoo:
Найти все детали приза, выигранного PETER GRÜNBERG

Не-ASCII символы

ans: выберите * из nobel, где победитель, как'P% GR% _% berg ';

0 голосов
/ 29 ноября 2017

@ Ответ zende был единственным, который покрывал столбцы смесью символов ascii и non ascii, но у него также была эта проблемная шестнадцатеричная вещь. Я использовал это:

SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !=''
0 голосов
/ 12 сентября 2016

Попробуйте использовать этот запрос для поиска записей специальных символов

SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'
...