2016-05-22 30 views
0

我有一张名为user的表,它将通过user_id和username进行查询。而user_id类型为int,username(具有类型varchar)不应该只有包含数字。该程序可以帮助检查输入,但我希望通过在数据库级别上不允许纯粹的数字来加倍保护它。如何防止在使用mysql的VARCHAR列中使用数字?

如何做到这一点?

+0

对user_id使用整数类型,所以你只能存储数值数据 –

+0

@BerndBuffen我的问题是我不想有数字数据(在varchar中) –

回答

0

您正在寻找CHECK SQL操作。不幸的是,这个不受任何MySQL引擎的支持。

虽然有一个解决方法是利用SQL触发器。你可以在CHECK constraint in MySQL is not working找到更多的信息和http://dev.mysql.com/doc/refman/5.7/en/create-trigger.html

所以,对我(的MySQL 5.5 +需要),以下snipplet工作:

use test; 

CREATE TABLE user (
    `user_id` INT NOT NULL, 
    `username` VARCHAR(50) NULL, 
    PRIMARY KEY (`id`) 
); 

delimiter // 

create trigger trg_trigger_test_ins before insert on user 
for each row 
begin 
    if new.username REGEXP '^[0-9]*$' then 
     signal sqlstate '45000' set message_text = 'Invalid username containing only digits'; 
    end if; 
end 
// 

delimiter ; 

insert into user values(1, '1234'); 

最后INSERT声明提出了一个Error Code: 1644. Invalid username containing only digits

insert into `test`.`user` values(1, 'a1234'); 
已正确插入

注意:有些荣誉也给想法Throw an error in a MySQL trigger

请注意,此示例只能防止INSERT s。如果您想要安全,您还需要在UPDATE上实施触发器。

0

您可以使用isNaN()函数来检查输入值user_name

点击here为了解isNAN()

+0

我的意思是MySQL系统,有没有办法检查一下? –

+0

更好地确保在客户端进行验证并将其发送到服务器端。它始终是良好的做法 – Mujahidh

+1

是的,我明白,但我的意思是我想在数据库级别进行验证(在程序检查之后;客户端站点甚至无法安全,入门级黑客可以轻松修改脚本并提交) –

相关问题