MySQL에서 ASCII가 아닌 문자를 어떻게 찾을 수 있나요?
-
03-07-2019 - |
해결책
정확히 무엇을 "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 정규식.
다른 팁
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 (Lithuanian, Latvian, Estonian)에서 어떤 문자가 올바르게 렌더링되지 않는지 알아 보려면 CONVERT(columnToCheck USING cp1257)
소수점 값이 0-127 (0x00-0x7f) 인 모든 문자로 ASCII를 정의하고 다음 쿼리를 사용하여 ASCII 문자가 아닌 열을 찾을 수 있습니다.
SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';
이것은 내가 생각해 낼 수있는 가장 포괄적 인 쿼리였습니다.
이것은 아마도 당신이 찾고있는 것일 것입니다.
select * from TABLE where COLUMN regexp '[^ -~]';
열에 열이 아닌 문자가 포함 된 모든 행 (또는 Newline과 같은 인쇄 할 수없는 ASCII 문자)이 포함 된 모든 행을 반환해야합니다.
위의 모든 사람의 예에서 누락 된 문자 중 하나는 종료 문자 ( 0)입니다. 이것은 MySQL 콘솔 출력에 보이지 않으며 지금까지 언급 된 쿼리 중 어느 것도 발견 할 수 없습니다. 찾기위한 쿼리는 간단합니다.
select * from TABLE where COLUMN like '%\0%';
정답을 기반으로하지만 ASCII Control 문자도 고려해야 할 솔루션은 다음과 같습니다.
SELECT * FROM `table` WHERE NOT `field` REGEXP "[\\x00-\\xFF]|^$";
똑같은 일을합니다. 열에서 ASCII 범위의 위반을 검색하지만 코드 포인트에 대해 16 진도 표기법을 사용하므로 제어 문자도 검색 할 수 있습니다. 비교 나 변환이 없기 때문에 ( @Ollie의 답변과 달리) 이것은 상당히 빠르야합니다. (특히 MySQL이 Regex Query에서 조기 종료하는 경우 확실히해야합니다.)
또한 제로 길이의 반환 필드를 피합니다. 더 나은 성능이 뛰어날 수있는 약간 더 길은 버전을 원한다면 대신 사용할 수 있습니다.
SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
REGEX 패스를 고려하지 않고 제로 길이 결과를 피하기 위해 길이가 별도의 검사를 수행합니다. 가지고있는 제로 길이 항목의 수에 따라 상당히 빠를 수 있습니다.
기본 문자 세트가 0x00-0xff가 ASCII와 동일한 값에 맵핑되지 않는 경우 기괴한 것 (어디서나 존재하는 문자가 있습니까?)가 거짓 긍정적 인 것을 반환 할 것입니다. 그렇지 않으면 즐기십시오!
특수 문자 레코드를 검색하려면이 쿼리를 사용해보십시오
SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'
@Zende의 답변은 ASCII와 비 ASCII 문자가 혼합 된 열을 덮은 유일한 사람 이었지만 문제가있는 16 진수를 가졌습니다. 나는 이것을 사용했다 :
SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !=''
Oracle에서는 아래에서 사용할 수 있습니다.
SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;
이 질문에 대해서도이 방법을 사용할 수도 있습니다.
SQL 동물원의 질문 :
Peter Grünberg의 상금에 대한 모든 세부 사항을 찾으십시오.
비 ASCII 문자
ANS : 선택*NOBEL에서 우승자가 'P%gr%_%Berg';