2013-04-14 15 views
6

私は電話番号という属性があり、このフィールドのエントリに特定の妥当性を適用したいとします。正規表現は制約を定義する際に非常に柔軟なので、この目的のために正規表現を使用できますか?正規表現を使用してMySQLでデータチェックを行うことは可能ですか

+1

短い回答:可能です。コンテキストを追加できますか?入力時にフィルタリングしますか?もしそうなら、ユーザーがサインアップしたときなどにフィルタリングしないのはなぜですか? – HamZa

+0

@HamZaDzCyber​​DeVいいえ、入力時ではありません。私はこれをデータベースに強制したい。私はそれがアプリケーション層で行うことができることを理解し、テーブルを作成するときに同じことがデータベースレイヤーで可能かどうか疑問に思っていました。 –

+0

テーブルを作成するときには、列の種類を指定する必要があります。「電話番号」タイプはありません。 [トリガー](http://dev.mysql.com/doc/refman/5.6/en/triggers.html) – HamZa

答えて

12

はい、できます。 MySQLは正規表現(http://dev.mysql.com/doc/refman/5.6/en/regexp.html)をサポートしており、データ検証のためにMySQLはCHECK制約をサポートしていないので、トリガを使用する必要があります(代わりに、常にPostgreSQLに移動できます)。注意!残念ながら、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

ありがとうございました。これは私が探していたものです。私は、すべてのレイヤーですべてのバリデーションを行う必要があることを理解していますが、データレイヤーの仕組みを知る必要がありました。 –

関連する問題