2013-04-14 8 views
6

Załóżmy, że mam atrybut o nazwie numer telefonu i chciałbym wprowadzić pewną ważność w odniesieniu do wpisów w tym polu. Czy mogę użyć do tego celu wyrażenia regularnego, ponieważ Wyrażenie regularne jest bardzo elastyczne przy definiowaniu wiązań.Czy możliwe jest egzekwowanie sprawdzania danych w MySQL przy użyciu wyrażenia regularnego

+1

Krótka odpowiedź: Tak, możesz. Czy możesz dodać więcej kontekstu? Czy chcesz filtrować to na wejściu? Jeśli tak, to dlaczego nie filtrować, gdy na przykład użytkownik zarejestruje się? – HamZa

+0

@HamZaDzCyberDeV Nie, nie na wejściu. Chcę wymusić to w bazie danych. Rozumiem, że można to zrobić w warstwie aplikacji, zastanawiałem się, czy to samo możliwe było w warstwie bazy danych podczas tworzenia tabel. –

+0

Podczas tworzenia tabeli musisz określić typ kolumny, nie ma typu "numer telefonu". Możesz spojrzeć na [wyzwalacze] (http://dev.mysql.com/doc/refman/5.6/en/triggers.html) – HamZa

Odpowiedz

12

Tak, możesz. MySQL obsługuje regex (http://dev.mysql.com/doc/refman/5.6/en/regexp.html) i do sprawdzania poprawności danych należy użyć wyzwalacza, ponieważ MySQL nie obsługuje ograniczenia CHECK (zawsze możesz przejść do PostgreSQL jako alternatywy :). NB! Należy pamiętać, że nawet jeśli MySQL ma konstrukcję ograniczenia CHECK, niestety MySQL (do tej pory 5.6) nie sprawdza poprawności danych względem ograniczeń sprawdzania. Według http://dev.mysql.com/doc/refman/5.6/en/create-table.html: "Klauzula CHECK jest analizowana, ale ignorowana przez wszystkie silniki magazynujące."

Możesz dodać ograniczenie wyboru do kolumny telefon:

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!!! 

Jednak nie należy polegać jedynie na MySQL (warstwy danych w Twoim przypadku) do sprawdzania poprawności danych. Dane powinny zostać zweryfikowane na wszystkich poziomach aplikacji.

+0

Dzięki. Tego właśnie szukałem. Rozumiem, że wszystkie sprawdzania poprawności powinny być wykonywane na wszystkich warstwach, ale musiałem wiedzieć, jak to zrobić dla warstwy danych. –

Powiązane problemy