我本来以为这一部分对于有编程基础的人来说很容易就没有详细的研究。后来,在设计数据库表的时候,用varchar类型写入中文会乱码,之后我将varchar类型改为nvarchar类型时才解决。我意识到,这部分很简单,但也要仔细区分。
数据类型定义要精确,这样不容易出现意想不到的问题,也节省了内存。
首先解决一个问题:字符与字节
(一)“字节”的定义
字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。
(二)“字符”的定义
字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。
(三)“字节”与“字符”
不同编码里,字符和字节的对应关系不同:
①ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。
②UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
③Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
④UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
⑤UTF-32编码中,世界上任何字符的存储都需要4个字节。
一:定义列的数据类型
字符串
1:char [(n)]
固定长度,非Unicode字符数据。(在列数据项的大小一致时使用)
n的范围1-8000字节
2:varchar [(n|max)]
可变长度,非Unicode字符数据。(在列的数据项的大小差距很大时使用)
Max指示最大存储大小2的31次幂-1字节。
3:text
服务器代码页中长度可变的非Unicode字符数据,最大长度为2的31次幂-1个字符。
Unicode字符串
1:nchar [(n)]
固定长度,Unicode字符数据。
n的范围1-4000
2:nvarchar [(n|max)]
可变长度,Unicode字符数据。
Max指示最大存储大小2的31次幂-1字节。
3:ntext
长度可变的Unicode字符数据,最大长度为2的31次幂-1个字符。
数字数据类型分为精确数字类型和近似数字类型
精确数字类型
A:整数
Bigint 8字节
Int 4字节
Smallint 2字节
Tinyint 1字节
B:浮点数
Decimal [(p,[,s])]
Numeric [(p,[,s])]
P(精度)表示最多可以存储的十进制数字的我那个位数,包括小数点左边和右边的位数。
S(小数位数)
近似数字类型
Real 4字节 可以存储正的或者负的十进制数值,最大可以有7位精确的位数
Float [n] 其中n表示用于存储float数值尾数的位数(以科学计数法表示),n的值必须介于1-53之间,默认值为53
日期和时间
1:datetime 8字节
日期和时间作为一个单列值存储在一起,日期1753-1-1到9999-12-31
时间部分的精度是3.33毫秒
2:smalldatetime 4字节
比datetime范围小。日期1900-1-1到2079-6-6
时间部分职能精确到分钟
3:date 3字节
只可以存储一个日期值。日期0001-1-1到9999-12-31
4:time
time存储使用24小时制
5:datetime2
日期0001-1-1到9999-1-1
时间部分能够存储只有一个小时,分钟和秒得时间值。
二进制数据类型
Image 长度可变的二进制数据类型 最大长度为2的31次幂-1个字节。
Binary [(n)]长度固定 n范围1-8000
varBinary [(n|max)]长度可变二进制数据 最大长度为2的31次幂-1个字节。
二:数据的完整性约束
数据完整性分为4类:实体完整性,域完整性,参照完整性,用户定义的完整性。
1:实体完整性
实体完整性规定表的每一行在表中是唯一的实体。实体是数据库所要表示的一个实际的物体或事件。实体完整性要求主键的组件不能为空值。
2:域完整性
域完整性
是指数据库表的列必须满足某种特定的数据类型或约束。
3:参照完整性
参照完整性是指两个表的主键和外键的数据应对应一致。
4:用户定义的完整性
实现用户定义完整性的方法有规则,触发器,存储过程和数据表创建时使用的约束。
列的约束
1:非空约束 (NOT NULL)
非空约束就是限制一个列不允有空值,与它对应的就是空值约束。(NULL与NOT NULL)
注意事项:
① :NULL值不应放在引号内,否则会被解释为字符串’NULL’而不是空值
② :NOT NULL 限制,插入一行不允许空值,除非存在DEFAULT约束
2:自动编号约束(IDENTITY)可以唯一确定一条记录的字段。
3:主键约束
主键(PRIMARY KEY)是使用数据表中的一列或多了来唯一标识一条记录。
主键约束,该列不能包含空值和重复值,并且image和text类型的列不能定义为主键。
4:外键约束
外键(FOREIGN KEY)保证了数据库各表的一致性和正确性。
5:唯一性约束
唯一性约束(UNIQUE)防止一列输入重复的值。
6:验证约束
验证约束(CHECK)检查输入数据是否符合要求。
7:默认值约束
默认值约束(DEFAULT)
注意事项
a. 如果字段定义有默认值,则系统将默认值插入字段
b. 如果字段定义没有默认值,但允许空值,则插入空值
c. 如果字段定义没有默认值,又不允许为空,则报错
一列最多有一个默认值,其中包含NULL值。
DEFAULT约束定义的默认值仅在插入操作时生效。
具有IDENTITY属性或TIMESTAMP数据类型属性的列不能使用默认值,text和image类型的列只能以NULL为默认值。