2016-05-22 60 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

是的,我明白,但我的意思是我想在數據庫級別進行驗證(在程序檢查之後;客戶端站點甚至無法安全,入門級黑客可以輕鬆修改腳本並提交) –

相關問題