MySQL에서 ASCII가 아닌 문자란?
ASCII가 아닌(non-ASCII) 문자란 파운드 기호(£), 상표 기호(™), 플러스마이너스 기호(±)처럼 표준 ASCII 범위(0~127)를 벗어난 문자들을 의미합니다. 테이블에 저장된 데이터 중 이러한 비(非)ASCII 문자를 찾으려면 아래의 단계를 순서대로 따라 하면 됩니다.
1단계: 테이블 생성
먼저 CREATE 명령어를 사용해 테스트용 테이블을 생성합니다.
mysql> CREATE table NonASciiDemo
-> (
-> NonAScii varchar(100)
-> );
Query OK, 0 rows affected (0.61 sec)
2단계: 데이터 삽입
다음으로 INSERT 명령어를 사용해 샘플 레코드를 삽입합니다.
mysql> INSERT into NonASciiDemo values('-,-');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT into NonASciiDemo values(' ');
Query OK, 1 row affected (0.23 sec)
mysql> INSERT into NonASciiDemo values('£');
Query OK, 1 row affected (0.30 sec)
mysql> INSERT into NonASciiDemo values('123abcd£');
Query OK, 1 row affected (0.24 sec)위와 같이 총 네 개의 레코드를 삽입했습니다. 이 중 두 개는 파운드 기호(£)가 포함된 비(非)ASCII 문자 레코드이고, 나머지 두 개는 ASCII 문자만 포함한 레코드입니다.
3단계: 전체 데이터 확인
SELECT 명령어로 테이블의 모든 레코드를 조회합니다.
SELECT * from NonASciiDemo;
실행 결과는 다음과 같습니다.
+----------+
| NonAScii |
+----------+
| -,- |
| |
| £ |
| 123abcd£ |
+----------+
4 rows in set (0.00 sec)
비(非)ASCII 문자를 찾는 쿼리 작성법
HEX 함수와 REGEXP 연산자를 조합하면 ASCII 범위를 벗어난 문자가 포함된 행을 손쉽게 필터링할 수 있습니다. 기본 문법은 다음과 같습니다.
SELECT * FROM yourTableName WHERE NOT HEX(yourColumnName) REGEXP '^([0-7][0-9A-F])*$';
이 쿼리의 동작 원리는 간단합니다. ASCII 문자의 16진수 코드는 항상 첫 번째 자리가 0~7 사이이므로, HEX 값이 해당 정규식 패턴과 일치하지 않으면 그 컬럼에는 ASCII 범위 밖의 문자가 포함되어 있다는 의미입니다.
실제 테이블에 적용한 쿼리 예시는 다음과 같습니다.
mysql> SELECT * FROM NonASciiDemo WHERE NOT HEX(NonAScii) REGEXP '^([0-7][0-9AF])*$';
위 쿼리의 실행 결과입니다.
+----------+
| NonAScii |
+----------+
| £ |
| 123abcd£ |
+----------+
2 rows in set (0.00 sec)
결과를 보면 파운드 기호(£)가 포함된 두 개의 레코드만 반환된 것을 확인할 수 있습니다. 이처럼 HEX 함수와 REGEXP를 함께 사용하면 MySQL에서 ASCII 범위를 벗어난 문자가 섞여 있는 데이터를 빠르고 정확하게 찾아낼 수 있습니다.