Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 정규 표현식으로 데이터 검사를 강제하는 방법

네, MySQL에서도 정규 표현식(Regular Expression)을 활용해 데이터 검사를 강제할 수 있습니다. 방법은 간단합니다. 먼저 테이블을 생성한 후, 해당 테이블에 BEFORE INSERT 트리거를 만들어 INSERT가 실행되기 전에 데이터 형식을 검증하도록 하는 것입니다. 이 글에서는 전화번호 형식을 검사하는 예제를 통해 그 과정을 단계별로 살펴보겠습니다.

1. 테이블 생성하기

가장 먼저 전화번호를 저장할 테이블을 생성합니다. 아래 쿼리를 실행하면 yourPhoneNumber라는 컬럼 하나를 가진 테이블이 만들어집니다.

mysql> create table enforceDataUsingRegularExpression
   - > (
   - > yourPhoneNumber varchar(60)
   - > );
Query OK, 0 rows affected (0.59 sec)

2. BEFORE INSERT 트리거 생성하기

다음으로, 데이터가 삽입되기 전에 정규 표현식으로 전화번호 형식을 검사하는 트리거를 생성합니다. 아래 예제에서는 국가 코드(선택 사항)와 하이픈(-)을 포함할 수 있는 전화번호 패턴을 검사하며, 형식이 맞지 않으면 SIGNAL SQLSTATE를 통해 에러를 발생시켜 잘못된 데이터의 입력 자체를 차단합니다.

mysql> DELIMITER //
mysql> CREATE TRIGGER enforce_phone_check BEFORE INSERT ON enforceDataUsingRegularExpression
   - > FOR EACH ROW
   - > BEGIN
   - > IF (NEW.yourPhoneNumber REGEXP '^(\\+?[0-9]{1,4}-)?[0-9]{3,10}$' ) = 0 THEN
   - > SIGNAL SQLSTATE '33455'
   - > SET MESSAGE_TEXT = 'Your Phone Number is incorrect';
   - > END IF;
   - > END //
Query OK, 0 rows affected (0.16 sec)
mysql> DELIMITER ;

여기서 사용된 정규 표현식 '^(\+?[0-9]{1,4}-)?[0-9]{3,10}$'의 의미는 다음과 같습니다.

  • \+?: 선택적으로 '+' 기호 허용
  • [0-9]{1,4}-?: 1~4자리 숫자와 하이픈으로 구성된 국가 코드(선택 사항)
  • [0-9]{3,10}$: 3~10자리 숫자로 끝나는 번호 본문

3. 잘못된 데이터 삽입 시 오류 확인

이제 규칙에 맞지 않는 데이터를 삽입해 보겠습니다. 정규 표현식 조건에 부합하지 않으면 트리거가 동작하여 에러 메시지와 함께 INSERT가 거부됩니다.

mysql> insert into enforceDataUsingRegularExpression values("+55242-64576");
ERROR 1644 (33455): Your Phone Number is incorrect
mysql> insert into enforceDataUsingRegularExpression values("+76-WD1232221");
ERROR 1644 (33455): Your Phone Number is incorrect

첫 번째 값은 국가 코드 자릿수 제한(최대 4자리)을 초과했고, 두 번째 값은 번호 본문에 숫자가 아닌 문자(WD)가 포함되어 있기 때문에 두 경우 모두 에러가 발생했습니다.

4. 올바른 데이터 삽입하기

반대로 형식에 맞는 올바른 전화번호를 삽입하면 정상적으로 저장됩니다.

mysql> insert into enforceDataUsingRegularExpression values("+55-1232221");
Query OK, 1 row affected (0.13 sec)

5. 결과 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회해 보면, 형식 검사를 통과한 데이터만 저장된 것을 확인할 수 있습니다.

mysql> select *from enforceDataUsingRegularExpression;

실행 결과는 다음과 같습니다.

+-----------------+
| yourPhoneNumber |
+-----------------+
| +55-1232221     |
+-----------------+
1 row in set (0.00 sec)

정리

이처럼 MySQL에서는 CHECK 제약 조건 대신 트리거와 REGEXP 연산자를 조합하면 애플리케이션 계층에 의존하지 않고도 데이터베이스 차원에서 데이터 유효성 검사를 강제할 수 있습니다. 특히 MySQL 8.0 이전 버전에서 CHECK 제약 조건이 무시되던 환경이라면 이 방법이 매우 유용한 대안이 됩니다. 다만 트리거 로직이 복잡해질수록 유지보수 비용이 증가할 수 있으므로, 검증 규칙은 최대한 단순하고 명확하게 설계하는 것이 좋습니다.