我有“客户”表:
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语句?感谢。
答案 0 :(得分:1)
由于这些字段都是可变长度,所以你一定要使用VARCHAR而不是CHAR来代表'用户名','密码'和& '姓'。如果您对这些长度有限制,那么您始终可以将VARCHAR类型限制为该限制。
至于'PhoneNumber'& 'MobileNumber',您将不会使用这些值执行任何计算,因此没有理由不将它们存储为VARCHAR,更不用说电话号码通常包含0作为第一个字符,不能存储为任何INT的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;
答案 1 :(得分:0)
所有这些问题都与您的要求有关......例如
如果此字段中只有数字,您可以BIGINT
使用MobileNumber
。
如果其中也可能包含字符,您将使用VARCHAR
。
VARCHAR
和CHAR
都有各自的优缺点
使用VARCHAR
可让您自由地在一个字符串中包含任意数量的字符,
例如VARCHAR(30)
最多可存储30个字符,如果字符数较少在其中,然后自动转储剩余内存。您也可以使用VARCHAR(max)
来实现此目的,它将使用所有传递的字符,然后转储剩余的内存
CHAR(30)
也会存储30个字符,但它不会处理内存。
在较小的程序中,内存可能不是问题,但如果程序很大,它可能会产生重大影响。
答案 2 :(得分:0)
对于密码,请使用字节数组 1 并存储密码的单向哈希。当验证用户输入的密码时,请对其进行散列并将其与存储的散列进行比较。
除此之外,您还应该使用salting和(理想情况下)将整个身份验证基础架构与防火墙和定义良好的API之外的自己的服务器分开。
相关答案:
1 RAW
,PostgreSQL中的bytea
,MS SQL Server中的varbinary
,MySQL等中的BLOB
......