전화 번호라는 속성이 있다고 가정하고이 필드의 항목에 특정 유효성을 적용하고 싶습니다. 정규식은 제약 조건을 정의 할 때 매우 유연하기 때문에 이러한 목적으로 정규 표현식을 사용할 수 있습니까?정규식을 사용하여 MySQL에서 데이터 검사를 시행 할 수 있습니까
답변
예, 가능합니다. 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의 (귀하의 경우 데이터 층)에 단순히 의존해서는 안하지만. 데이터는 앱의 모든 수준에서 유효성을 검사해야합니다.
감사합니다. 이것은 제가 찾고 있었던 것입니다. 모든 유효성 검사가 모든 레이어에서 수행되어야한다는 것을 알고 있지만 데이터 레이어에서 어떻게 유효한지 알 필요가있었습니다. –
짧은 대답 : 가능합니다. 컨텍스트를 추가 할 수 있습니까? 입력시 필터링 하시겠습니까? 그렇다면 사용자가 예를 들어 가입 할 때 왜 필터링하지 않습니까? – HamZa
@HamZaDzCyberDeV 아니요, 입력시가 아닙니다. 나는 이것을 데이터베이스에 적용하려고한다. 응용 프로그램 계층에서이 작업을 수행 할 수 있음을 이해합니다. 테이블을 만들 때 데이터베이스 계층에서 동일한 작업이 가능한지 궁금합니다. –
테이블을 만들 때 열 유형을 지정해야하며 "전화 번호"유형은 없습니다. [트리거] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html) – HamZa