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

StackOverflow https://stackoverflow.com/questions/401771

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

Смотрите это для более подробного обсуждения. 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 NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';

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

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

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

Он должен возвращать все строки, где СТОЛБЕЦ содержит символы, отличные от ASCII (или непечатаемые символы ASCII, такие как перевод строки).

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

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

Основываясь на правильном ответе, но принимая во внимание также управляющие символы 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 (существует ли где-нибудь такой набор символов?), это вернет ложноположительный результат.В противном случае, наслаждайтесь!

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

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

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

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

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

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

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

Вопрос из sql zoo:
Узнайте все подробности о призе, выигранном ПИТЕРОМ ГРЮНБЕРГОМ

Символы, отличные от ASCII

ans:выберите * из списка нобелевских лауреатов, где нравится "P% GR%_%berg";

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top