我的 MySQL 数据库中的正则表达式无法正常工作

My regex in my MySQL database isn't working

我的 MySQL 服务器中的正则表达式检查似乎无法正常工作,或者我犯了一个非常明显的错误(抱歉,如果是这样的话我无法发现它)。

触发器:trig_check_memebers

事件:插入

Table: tbl_members

声明: 开始 IF (NEW.member_email REGEXP '^(\w+@\w+.\w+)$') = FALSE 那么 信号 SQLSTATE '12345' 设置 MESSAGE_TEXT = 'invalid email'; 万一; 结束

时间:之前

已创建:NULL

sql_mode:NO_ENGINE_SUBSTITUTION

所以这是我的触发器,只是为了显示我拥有的正则表达式,它已突出显示。这是我的证明(可能是错误的)它适用于我想输入的数据。

我知道它是一个糟糕的正则表达式我刚开始学习它并想测试基本的东西,就像我知道如果有像 xxx.yyy@foo.bar 这样的电子邮件它不会有相同的结果.

这里是我的测试数据产生错误。

INSERT INTO tbl_members VALUES ('jeff', 'password', 'hardy', 'jeff', 'matt',     'you@you.you');

Error
  SQL query:


  INSERT INTO tbl_members VALUES ('jeff', 'password', 'hardy', 'jeff', 'matt',     'you@you.you')
  MySQL said: Documentation

  #1644 - invalid email 

^ 不是真正的代码,错误信息。

<?php
    //Variables
    $database_name;
    $dbc;
    $table_create_queries;
    $triggers;
    //Initialization
    $database_name = 'PolySoft';
    $dbc = new mysqli('localhost', 'root', null);

    $table_create_queries = array
    (
        //Members Table
        'tbl_members' => 'CREATE TABLE tbl_members(member_username varchar(40) NOT NULL,
        member_password varchar(60) NOT NULL,
        member_surname varchar(40) NOT NULL,
        member_forename varchar(40) NOT NULL,
        member_othernames varchar(40),
        member_email varchar(254),
        UNIQUE(member_email),
        PRIMARY KEY(member_username));'
        ,
        //Addresses Table
        'tbl_addresses' => 'CREATE TABLE tbl_addresses(address_postcode varchar(10) NOT NULL,
        address_country varchar(255) NOT NULL,
        address_county varchar(255),
        address_city varchar(255) NOT NULL,
        address_town varchar(255),
        address_street varchar(255) NOT NULL,
        address_house_name_or_number varchar(255) NOT NULL,
        PRIMARY KEY(address_postcode));'
    );
    $triggers = array
    (
        'check_members' =>'CREATE TRIGGER trig_check_memebers 
            BEFORE INSERT ON tbl_members 
            FOR EACH ROW 
            BEGIN
                IF (NEW.member_email REGEXP \'^(\\w+@\\w+\\.\\w+)$\') = FALSE THEN
                    SIGNAL SQLSTATE \'12345\'
                    SET MESSAGE_TEXT = \'invalid email\';
                END IF;
            END;'
    );

    $dbc->query("DROP DATABASE IF EXISTS $database_name");
    $dbc->query("CREATE DATABASE $database_name");
    $dbc->close();
    $dbc = new mysqli('localhost', 'root', null, $database_name);
    foreach($table_create_queries as $tbl => $query)
    {
        $dbc->query($query);
    }
    foreach($triggers as $trig => $query)
    {
        $dbc->query($query);
    }
    $dbc->query("INSERT INTO tbl_members VALUES ('jeff', 'password', 'hardy', 'jeff', 'matt', 'you@you.you')");
    //$dbc->query();
    $dbc->close();
    ?>

如果有人想知道我为什么要删除和创建数据库:代码实际上永远不会在服务器上,所以对于我的任务,我可以 运行 任何服务器上的脚本,所以我不必依靠带入我的 PC 来展示它是如何工作的。导师可以 运行 自己创建它,它也适用于我的数据库模块,所以将所有 sql 放在一个位置也对我的参考等有好处。

Is it Possible to Enforce Data Checking in MySQL using Regular expression

最上面的答案是我得到触发代码的原因。

将您的正则表达式更改为:

^[A-Za-z_]+@[A-Za-z_]+\.[A-Za-z_]+$