문제

저는 다음에서 가져온 일부 데이터가 있는 MySQL 데이터베이스로 작업하고 있습니다. 뛰어나다.데이터에는 다음이 포함되지 않습니다.아스키 문자(엠 대시 등)와 숨겨진 캐리지 리턴 또는 줄바꿈을 포함합니다.MySQL을 사용하여 이러한 레코드를 찾는 방법이 있습니까?

도움이 되었습니까?

해결책

정확히 무엇을 "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';

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top