【发布时间】:2020-08-04 10:10:48
【问题描述】:
我的数据库中有一个电话号码字段,我想让它只接受准确的 9 个数字
Mysql版本:5.7.31
【问题讨论】:
-
如何将其保存为 varchar(9) 并在您的应用上验证仅允许使用数字?
-
我想在数据库上验证它。
我的数据库中有一个电话号码字段,我想让它只接受准确的 9 个数字
Mysql版本:5.7.31
【问题讨论】:
根据CHECK Constraint添加。
作为列约束:
CREATE TABLE my_table (
...
phone_number INT
NOT NULL
CHECK (phone_number BETWEEN 100000000 AND 999999999),
... );
或作为表约束:
CREATE TABLE my_table (
...
phone_number INT
NOT NULL,
CONSTRAINT phone_9_digits
CHECK (phone_number BETWEEN 100000000 AND 999999999),
... );
约束只处理一列 - 所以列约束类型是首选。
如何对现有表执行此操作?
更改列定义或表定义。例如,
ALTER TABLE my_table
CHANGE COLUMN phone_number
phone_number INT
NOT NULL
CHECK (phone_number BETWEEN 100000000 AND 999999999);
如果您使用不支持 CHECK 约束的旧 MySQL 版本,请使用触发器包。
CREATE TRIGGER tr_bi_check_phone_for_9digits
BEFORE INSERT -- and the same for BEFORE UPDATE
ON my_table
FOR EACH ROW
BEGIN
IF NEW.phone_number NOT BETWEEN 100000000 AND 999999999 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Phone Number must have 9 digits strictly.';
END IF;
END
如果phone_number 存储为字符串,则检查条件phone_number BETWEEN 100000000 AND 999999999 可以替换为,例如
phone_number REGEXP '[0-9]{9}'
这也将允许您存储从零开始的电话号码。
【讨论】:
首先,我不想在数据库中实现这个逻辑。它可能会发生变化(并非每个国家/地区都有相同的电话号码布局,即使在一个国家/地区内,有时电话号码格式也会发生变化)。您可能想要强加某种格式(例如,将区号与数字分开)。使用数据库错误作为沟通格式问题的一种方式通常不是很好 - 用户界面需要理解该逻辑,而且它不是特别容易管理。
但如果你真的想在数据库中做,你可以创建一个trigger来验证输入,然后再将其写入表,否则会抛出错误。
【讨论】:
您是否曾经填写过表格,却因为没有使用 它 期望的邮政编码、电话、信用卡号的确切间距、破折号、括号等而被它吐槽?
为了用户着想,我强烈建议您允许任何通常允许的间距等。然后删除多余的东西。如果出现任何问题,请从 UI 中向用户吐口水,而不是数据库。数据库中的数据应该由 UI 清理。
国际电话号码前面的+1(或任何国家/地区代码)怎么样?还是您的应用是单一国家/地区的应用,并且会一直如此?
【讨论】: