2013-01-17 70 views
1

我有「客戶」表:密碼和手機類型數據庫

CREATE TABLE Customer 
(
    ID INTEGER NOT NULL DEFAULT 0, 
    Username CHAR(50) NOT NULL, 
    Password CHAR(100) NOT NULL, 
    LastName CHAR(20) NOT NULL, 
    PhoneNumber BIGINT NOT NULL, 
    MobileNumber BIGINT NOT NULL, 
    PRIMARY KEY (ID) 
) 
; 

我用char密碼類型,這是正確的?而對於手機號碼我使用bigint,這是正確的嗎?如果不是,我該怎麼辦?什麼是SQL語句?謝謝。

回答

1

由於這些字段都是可變長度,因此您應該使用VARCHAR而不是CHAR來輸入'用戶名','密碼'&'姓'。如果您對這些長度有限制,那麼您始終可以將VARCHAR類型限制爲該限制。

對於'PhoneNumber'&'MobileNumber',你將不會使用這些值進行任何計算,所以沒有理由不將它們存儲爲VARCHAR,更不用說電話號碼通常包含0作爲第一個不能作爲任何類型的INT存儲的字符。

是這樣的:

CREATE TABLE `Customer` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`Username` varchar(255) NOT NULL DEFAULT '', 
`Password` varchar(255) NOT NULL DEFAULT '', 
`LastName` varchar(255) NOT NULL DEFAULT '', 
`PhoneNumber` varchar(100) DEFAULT NULL, 
`MobileNumber` varchar(100) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+0

謝謝........................ –

0

所有這些問題關係上,你有...例如

可以使用BIGINTMobileNumber如果只打算在這個場數的要求。
如果在其中還可能有字符,則將使用VARCHAR

VARCHARCHAR都有各自的優點和缺點。
使用VARCHAR可以讓您自由地在單個字符串中包含儘可能多的字符,例如

例如,VARCHAR(30)最多可以存儲30個字符,並且如果其中的字符較少,則其餘內存會自動轉儲。您也可以使用VARCHAR(max)來達到此目的,它將使用所有傳遞的字符,然後轉儲其餘的內存。
CHAR(30)也將存儲30個字符,但它不會照顧內存。

內存可能不是小型程序中的問題,但是如果程序很大,它可以產生顯着的效果。

+0

我得到了你的手機號碼,但對於密碼,我應該放什麼?我需要爲密碼做散列,然後將它的散列存儲在該字段中 –

+0

再次取決於你使用哪種算法來進行加密,在我的應用程序中,我已經使用'VARCHAR(256)'作爲散列。 –

+0

如果它回答你的問題,那麼請標記它的答案..:D –

0

對於密碼,使用字節的陣列和存儲的單向密碼的哈希。當需要驗證用戶輸入的密碼時,對其進行散列並將其與存儲的散列進行比較。

除此之外,您還應該使用salting,並且(理想情況下)將整個身份驗證基礎結構與防火牆和定義良好的API之外的服務器分開。

相關答案:


RAW在Oracle中,bytea PostgreSQL中,varbinary在MS SQL服務器,在MySQL等BLOB .. 。