Как я могу найти символы не ASCII в MySQL?

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

Ответ 1

Это зависит от того, что вы определяете как "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. Регулярные выражения.

Ответ 2

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)

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

select * from TABLE where COLUMN like '%\0%';

Ответ 6

На основе правильного ответа, но с учетом управляющих символов ASCII, решение, которое сработало для меня, следующее:

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

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

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

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

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

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

Ответ 7

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

SELECT *
FROM tableName
WHERE fieldName REGEXP '[^[email protected]:. \'\-`,\&]'

Ответ 8

Ответ

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

SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !=''

Ответ 9

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

SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;

Ответ 10

Этот запрос вернет записи с не-ASCII символами в MySQL

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

Ответ 11

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

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

Не-ASCII символы

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