2013-04-14 6 views
6

전화 번호라는 속성이 있다고 가정하고이 필드의 항목에 특정 유효성을 적용하고 싶습니다. 정규식은 제약 조건을 정의 할 때 매우 유연하기 때문에 이러한 목적으로 정규 표현식을 사용할 수 있습니까?정규식을 사용하여 MySQL에서 데이터 검사를 시행 할 수 있습니까

+1

짧은 대답 : 가능합니다. 컨텍스트를 추가 할 수 있습니까? 입력시 필터링 하시겠습니까? 그렇다면 사용자가 예를 들어 가입 할 때 왜 필터링하지 않습니까? – HamZa

+0

@HamZaDzCyberDeV 아니요, 입력시가 아닙니다. 나는 이것을 데이터베이스에 적용하려고한다. 응용 프로그램 계층에서이 작업을 수행 할 수 있음을 이해합니다. 테이블을 만들 때 데이터베이스 계층에서 동일한 작업이 가능한지 궁금합니다. –

+0

테이블을 만들 때 열 유형을 지정해야하며 "전화 번호"유형은 없습니다. [트리거] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html) – HamZa

답변

12

예, 가능합니다. MySQL은 regex (http://dev.mysql.com/doc/refman/5.6/en/regexp.html)를 지원하고 데이터 유효성 검사를 위해 MySQL은 CHECK 제약 조건을 지원하지 않으므로 트리거를 사용해야합니다 (대체로 PostgreSQL로 이동할 수 있습니다 :). NB! MySQL이 CHECK 제약 구조를 가지고 있지만 유감스럽게도 MySQL (지금까지 5.6)은 체크 제약 조건에 대해 데이터의 유효성을 검사하지 않습니다. http://dev.mysql.com/doc/refman/5.6/en/create-table.html에 따르면 "CHECK 절은 모든 저장소 엔진에서 구문 분석되지만 무시됩니다."

당신은 열 전화에 대한 점검 제한 조건을 추가 할 수 있습니다

CREATE TABLE data (
    phone varchar(100) 
); 

DELIMITER $$ 
CREATE TRIGGER trig_phone_check BEFORE INSERT ON data 
FOR EACH ROW 
BEGIN 
IF (NEW.phone REGEXP '^(\\+?[0-9]{1,4}-)?[0-9]{3,10}$') = 0 THEN 
    SIGNAL SQLSTATE '12345' 
    SET MESSAGE_TEXT = 'Wroooong!!!'; 
END IF; 
END$$ 
DELIMITER ; 


INSERT INTO data VALUES ('+64-221221442'); -- should be OK 
INSERT INTO data VALUES ('+64-22122 WRONG 1442'); -- will fail with the error: #1644 - Wroooong!!! 

당신이 데이터 유효성 검사에 대한 MySQL의 (귀하의 경우 데이터 층)에 단순히 의존해서는 안하지만. 데이터는 앱의 모든 수준에서 유효성을 검사해야합니다.

+0

감사합니다. 이것은 제가 찾고 있었던 것입니다. 모든 유효성 검사가 모든 레이어에서 수행되어야한다는 것을 알고 있지만 데이터 레이어에서 어떻게 유효한지 알 필요가있었습니다. –