Вы можете протестировать регулярное выражение в клиенте MySQL без использования триггера:
mysql> select 'user@example.com' REGEXP '^[^@]+@[^@]+\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
| 1 |
+-------------+
Это ожидается, но как насчет того, чтобы мы дали ему недействительный адрес электронной почты?
mysql> select 'user@example.' REGEXP '^[^@]+@[^@]+\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
| 1 |
+-------------+
Это должно быть 0, но почему бы и нет?
Потому что \.
недостаточно, чтобы избежать точки в регулярном выражении. Один \
теряется, когда SQL анализирует строку. Нам нужно, чтобы литерал \
был в строке регулярного выражения, чтобы избежать точки. Таким образом, мы должны использовать двойной \\
, чтобы единственный литерал \
оставался в регулярном выражении после того, как MySQL его отсканировал один раз.
mysql> select 'user@example.' REGEXP '^[^@]+@[^@]+\\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
| 0 |
+-------------+
P.S. Для чего это стоит, электронные письма являются более сложными, чем ваша простая проверка. Этот старый архивированный блог имеет несколько попыток всесторонней проверки электронной почты: https://web.archive.org/web/20150910045413/http://squiloople.com/2009/12/20/email-address-validation
Самым успешным из них стало регулярное выражение, используемое в PHP FILTER_VALIDATE_EMAIL .