数据库存储中存储的是datetime类型,属对应的属性应为什么类型

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
2012数据库字段类型字段属性详解.doc 20页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:150 &&
你可能关注的文档:
··········
··········
MySQL字段类型详解 MySQL提供了整数和浮点数的数值类型。可根据所要表示的值的范围选择相应的类型。 对于整数类型,如果指定了AUTO_INCREMENT属性,则列必须为PRIMARYKEY或UNIQUE索引。将NULL插入AUTO_INCREMENT列将会插入一个大于该列中当前最大值的值。如果指定了UNSIGNED属性,则相应的整数类型不允许取负值。 如果指定了ZEROFILL属性,则用前导零填充数值类型值以达到列的显示宽度。 1.TINYINT[(M)] 说明:非常小的整数 允许的属性:AUTO_INCREMENT,UNSIGNED,ZEROFILL 取值范围:-128到127(-27到27-1),或者如果为UNSIGNED,则0到255(0到28-1) 缺省值:如果列可为NULL;则为NULL;如果列为NOTNULL,则为0 存储需求:1字节 2.SMALLINT[(M)] 说明:小整数 允许的属性:AUTO_INCREMENT,UNSIGNED,ZEROFILL 取值范围:-3(-215到215-1),或者如果为UNSIGNED,则0到66-1) 缺省值:如果列可为NULL;则为NULL;如果列为NOTNULL,则为0 存储需求:2字节 3.MEDIUMINT[(M)] 说明:中等大小的整数 允许的属性:AUTO_INCREMENT,UNSIGNED,ZEROFILL 取值范围:-88607(-223到223-1),或者如果为UNSIGNED,则0到到224-1) 缺省值:如果列可为NULL,则为NULL;如果列为NOTNULL,则为0 存储需求:4字节 4.INT[(M)] 说明:标准大小的整数 允许的属性:AUTO_INCREMENT,UNSIGNED,ZEROFILL 取值范围:-到(-231到231-1),或者如果为UNSIGNED,则0到(0到232-1) 缺省值:如果列为NULL,则为NULL;如果列为NOTFULL,则为0 存储需求:4字节 同义词:INTEGER[(M)] 5.BIGINT[(M)] 说明:大整数 允许的属性:AUTO_INCREMENT,UNSIGNED,ZEROFILL 取值范围:-75807(-263到263-1),或者如果为UNSIGNED,则0到到264-1) 缺省值:如果列可为NULL,则为NULL;如果列为NOTNULL,则为0 存储需求:8字节 6.FLOAT[(M,D)] 说明:小浮点数;单精度(精度小于DOUBLE) 允许的属性:ZEROFILL 取值范围:最小非零值为±1.;最大非零值为±3.E+38 缺省值:如果列可为NULL,则为NULL;如果列为NOTNULL,则为0 存储需求:4字节 同义词:MySQL3.23版以前,FLOAT(4)为具有缺省M和D值的FLOAT的同义词。 注释:在MySQL3.23以后,FLOAT(4)为真浮点类型(值存储为硬件所允许的完整精度,而不四舍五入为缺省的小数位数) 7.DOUBLE[(M,D)] 说明:大浮点数;双精度(比FLOAT更精确) 允许的属性:ZEROFILL 取值范围:最小非零值为±2.;最大非零值为±1。2 缺省值:如果列可为NULL,则为NULL;如果列为NOTNULL,则为0 存储需求:8字节 同义词:DOUBLEPRECISION[(M,D)]和REAL[(M,D)]为DOUBLE[(M,D)]的同义词。MySQL3.23版以前,FLOAT(8)为具有缺省M和D值的FLOAT的同义词。 注释:在MySQL3.23以后,FLOAT(8)为真浮点类型(值存储为硬件所允许的完整精度,而不四舍五入为缺省的小数位数)。 8.DECIMAL(M,D) 说明:存储为串的浮点数(每位数字、小数点或“-”号都占1字节)。 允许的属性:ZEROFILL 取值范围:最大取值范围与DOUBLE相同;给定DECIMAL类型的有效取值范围由M和D决定。如果D为零,则列值无小数点或小数部分。 缺省值:如果列可为NULL,则为NULL,如果列为NOTNULL,则为0 存储需求:对于MySQL3.23前的版本,为M字节,而MySQL3.23以后的版本,为M+2字节。 同义词:NUMERIC(M,D) 注释:在MySQL3.23以后,M的值为符合ANSISQL标准,不包括
正在加载中,请稍后...博客访问: 228157
博文数量: 71
博客积分: 1194
博客等级: 中士
技术积分: 766
注册时间:
得之坦然,失之淡然,争其必然,顺其自然!
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Mysql/postgreSQL
摘自MySQL中文文档:
表示时间值的DATE和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。TIMESTAMP类型有专有的自动更新特性,将在后面描述。
如果试图插入一个不合法的日期,MySQL将给出警告或错误。可以使用ALLOW_INVALID_DATES
SQL模式让MySQL接受某些日期,例如''。当你想要保存一个“可能错误的”用户已经在数据库中指定(例如,以web形式)用于将来处理的值时很有用。在这种模式下,MySQL只验证月范围为从0到12,日范围为从0到31。这些范围可以包括零,因为MySQL允许在DATE或DATETIME列保存日/月和日是零的日期。这在应用程序需要保存一个你不知道确切日期的生日时非常有用。在这种情况下,只需要将日期保存为''或''。如果保存此类日期,DATE_SUB()或DATE_ADD等需要完整日期的函数不会得到正确的结果。(如果你不想在日期中出现零,可以使用NO_ZERO_IN_DATE
SQL模式)。
MySQL还允许将''保存为“伪日期”(如果不使用NO_ZERO_DATE
SQL模式)。这在某些情况下比使用NULL值更方便(并且数据和索引占用的空间更小)。
将sql_mode系统变量设置为相应模式值,可以更确切你想让MySQL支持哪种日期。参见。
当使用日期和时间类型时应记住以下几点:
MySQL以标准输出格式检索给定日期或时间类型的值,但它尽力解释你指定的各种输入值格式(例如,当你指定一个分配给或与日期或时间类型进行比较的值时)。只支持下面章节中描述的格式。期望你能提供有效值。如果你使用其它格式的值会发生意想不到的结果。
包含两位年值的日期会令人模糊,因为世纪不知道。MySQL使用以下规则解释两位年值:
70-99范围的年值转换为。
00-69范围的年值转换为。
尽管MySQL尝试解释几种格式的值,日期总是以年-月-日顺序(例如,'98-09-04'),而不是其它地方常用的月-日-年或日-月-年顺序(例如,'09-04-98','04-09-98')。
如果值用于数值上下文中,MySQL自动将日期或时间类型的值转换为数字,反之亦然。
MySQL遇到一个日期或时间类型的超出范围或对于该类型不合法的值时(如本节开始所描述),它将该值转换为该类的“零”值。一个例外是超出范围的TIME值被裁剪到TIME范围的相应端点。
下面的表显示了各类“零”值的格式。请注意如果启用NO_ZERO_DATE
SQL模式,使用这些值会产生警告。
' 00:00:00'
'00:00:00'
“零”值是特殊值,但你可以使用表内显示的值显式保存或引用它们。你也可以使用值'0'或0来保存或引用,写起来更容易。
MyODBC中使用的“零”日期或时间值在MyODBC
2.50.12和以上版本中被自动转换为NULL,因为ODBC不能处理此类值。
11.3.1. DATETIME、DATE和TIMESTAMP类型
<span DATETIME、DATE和TIMESTAMP类型是相关的。该节描述了它们的特征,它们的相似点和不同点。
当你需要同时包含日期和时间信息的值时则使用DATETIME类型。MySQL以'YYYY-MM-DD
HH:MM:SS'格式检索和显示DATETIME值。支持的范围为'
00:00:00'到' 23:59:59'。(“支持”表示尽管先前的值可能工作,但没有保证)。
当你只需要日期值而不需要时间部分时应使用DATE类型。MySQL用'YYYY-MM-DD'格式检索和显示DATE值。支持的范围是''到
TIMESTAMP列类型的属性不固定,取决于MySQL版本和服务器运行的SQL模式。这些属性将在本节后面描述。
可以使用任何常见格式指定DATETIME、DATE和TIMESTAMP值:
'YYYY-MM-DD
HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间割符。例如,'98-12-31
11:30:45'、'98.12.31 11+30+45'、'98/12/31
11*30*45'和'98@12@31 11^30^45'是等价的。
'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。这里也允许使用“不严格的”语法。例如,'98-12-31'、'98.12.31'、'98/12/31'和'98@12@31'是等价的。
'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,'28'和''被解释为'
09:15:28',但''是不合法的(它有一个没有意义的分钟部分),将变为'
00:00:00'。
'YYYYMMDD'或'YYMMDD'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,''和'970523'被解释为
'',但'971332'是不合法的(它有一个没有意义的月和日部分),将变为''。
YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字,假定数字对于日期类型是有意义的。例如,00和被解释为
' 13:28:00'。
YYYYMMDD或YYMMDD格式的数字,假定数字对于日期类型是有意义的。例如,0905被解释为''。
函数返回的结果,其值适合DATETIME、DATE或者TIMESTAMP上下文,例如NOW()或CURRENT_DATE。
无效DATETIME、DATE或者TIMESTAMP值被转换为相应类型的“零”值('
00:00:00'、''或者00)。
对于包括日期部分间割符的字符串值,如果日和月的值小于10,不需要指定两位数。''与''是相同的。同样,对于包括时间部分间割符的字符串值,如果时、分和秒的值小于10,不需要指定两位数。'
1:2:3'与' 01:02:03'相同。
数字值应为6、8、12或者14位长。如果一个数值是8或14位长,则假定为YYYYMMDD或YYYYMMDDHHMMSS格式,前4位数表示年。如果数字
是6或12位长,则假定为YYMMDD或YYMMDDHHMMSS格式,前2位数表示年。其它数字被解释为仿佛用零填充到了最近的长度。
指定为非限定符字符串的值使用给定的长度进行解释。如果字符串为8或14字符长,前4位数表示年。否则,前2位数表示年。从左向右解释字符串内出现的各部分,以发现年、月、日、小时、分和秒值。这说明不应使用少于6字符的字符串。例如,如果你指定'9903',认为它表示1999年3月,MySQL将在你的表内插入一个“零”日期值。这是因为年和月值是99和03,但日部分完全丢失,因此该值不是一个合法的日期。但是,可以明显指定一个零值来代表缺少的月或日部分。例如,可以使用'990300'来插入值''。
在一定程度上,可以将一个日期类型的值分配给一个不同的日期类型。但是,值可能会更改或丢失一些信息:
如果你为一个DATETIME或TIMESTAMP对象分配一个DATE值,结果值的时间部分被设置为'00:00:00',因为DATE值未包含时间信息。
如果你为一个DATE对象分配一个DATETIME或TIMESTAMP值,结果值的时间部分被删除,因为DATE值未包含时间信息。
记住尽管可以使用相同的格式指定DATETIME、DATE和TIMESTAMP值,不同类型的值的范围却不同。例如,TIMESTAMP值不能早于1970或晚于2037。这说明一个日期,例如'',虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个对象将被转换为0。
当指定日期值时请注意某些缺陷:
指定为字符串的值允许的非严格格式可能会欺骗。例如,值'10:11:12'由于‘:’间割符看上去可能象时间值,但如果用于日期上下文值则被解释为年''。值'10:45:15'被转换为''因为'45'不是合法月。
在非严格模式,MySQL服务器只对日期的合法性进行基本检查:年、月和日的范围分别是、00到12和00到31。任何包含超出这些范围的部分的日期被转换成''。请注意仍然允许你保存非法日期,例如''。要想确保不使用严格模式时日期有效,应检查应用程序。
在严格模式,非法日期不被接受,并且不转换。
详细信息参见。
包含两位年值的日期会令人模糊,因为世纪不知道。MySQL使用以下规则解释两位年值:
00-69范围的年值转换为。
70-99范围的年值转换为。
11.3.1.1. 自MySQL
4.1以来的TIMESTAMP属性
注释:在旧版本的MySQL中(4.1之前),TIMESTAMP列类型的属性在许多方面于本节所描述的大大不同。如果你需要对旧的TIMESTAMP数据进行转化以便在MySQL
5.1中工作,详情请参见MySQL 4.1 参考手册。
TIMESTAMP列的显示格式与DATETIME列相同。换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD
HH:MM:SS。
MySQL服务器也可以以MAXDB模式运行。当服务器以该模式运行时,TIMESTAMP与DATETIME相等。也就是说,如果创建表时服务器以MAXDB模式运行,TIMESTAMP列创建为DATETIME列。结果是,该列使用DATETIME显示格式,有相同的值范围,并且没有自动对当前的日期和时间进行初始化或更新。
要想启用MAXDB模式,在启动服务器时使用--sql-mode=MAXDB服务器选项或在运行时通过设置全局sql_mode变量将SQL服务器模式设置为MAXDB:
mysql> SET GLOBAL sql_mode=MAXDB;
客户端可以按照下面方法让服务器为它的连接以MAXDB模式运行:
mysql> SET SESSION sql_mode=MAXDB;
MySQL不接受在日或月列包括一个零或包含非法日期值的时间戳值。该规则的唯一例外是特殊值'
00:00:00'。
你可以非常灵便地确定什么时候初始化和更新TIMESTAMP和对哪些列进行初始化和更新:
你可以将当前的时间戳指定为默认值和自动更新的值。但只能选择一个,或者两者都不选。(不可能一个列选择一个行为而另一个列选择另一个行为)。
你可以指定哪个TIMESTAMP列自动初始化或更新为当前的日期和时间。不再需要为第1个TIMESTAMP列。
请注意下面讨论所信息只适用于创建时未启用MAXDB模式的表的TIMESTAMP列。(如上所述,MAXDB模式使列创建为DATETIME列)。控制TIMESTAMP列的初始化和更新的规则如下所示:
如果一个表内的第1个TIMESTAMP列指定为一个DEFAULT值,则不能忽略。
默认值可以为CURRENT_TIMESTAMP或常量日期和时间值。
NULL与第1个TIMESTAMP 列的DEFAULT
CURRENT_TIMESTAMP相同。对于其它TIMESTAMP列,DEFAULT
NULL被视为DEFAULT 0。
表内的任何一个TIMESTAMP列可以设置为自动初始化为当前时间戳和/或更新。
TABLE语句中,可以用下面的任何一种方式声明第1个TIMESTAMP列:
CURRENT_TIMESTAMP和ON UPDATE
CURRENT_TIMESTAMP子句,列为默认值使用当前的时间戳,并且自动更新。
不使用DEFAULT或ON
UPDATE子句,与DEFAULT CURRENT_TIMESTAMP ON
UPDATECURRENT_TIMESTAMP相同。
CURRENT_TIMESTAMP子句不用ON UPDATE子句,列为默认值使用当前的时间戳但是不自动更新。
不用DEFAULT子句但用ON UPDATE
CURRENT_TIMESTAMP子句,列有默认值0并自动更新。
用常量DEFAULT值,列有给出的
默认值。如果列有一个ON UPDATE CURRENT_TIMESTAMP子句,它自动更新,否则不。
换句话说,你可以为初始值和自动更新的值使用当前的时间戳,或者其中一个使用,或者两个皆不使用。(例如,你可以指定ON
UPDATE来启用自动更新而不让列自动初始化)。
在DEFAULT和ON
UPDATE子句中可以使用CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()或者NOW()。它们均具有相同的效果。
两个属性的顺序并不重要。如果一个TIMESTAMP列同时指定了DEFAULT和ON
UPDATE,任何一个可以在另一个的前面。
例子,下面这些语句是等效的:
CREATE TABLE t (ts TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
DEFAULT CURRENT_TIMESTAMP);
要为TIMESTAMP列而不是第1列指定自动默认或更新,必须通过将第1个TIMESTAMP列显式分配一个常量DEFAULT值来禁用自动初始化和更新。(例如,DEFAULT
0或DEFAULT'
00:00:00')。然后,对于其它TIMESTAMP列,规则与第1个TIMESTAMP列相同,例外情况是不能忽略DEFAULT和ON
UPDATE子句。如果这样做,则不会自动进行初始化或更新。
例如:下面这些语句是等效的:
CREATE TABLE t (
ts1 TIMESTAMP DEFAULT 0,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (
ts1 TIMESTAMP DEFAULT 0,
ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
DEFAULT CURRENT_TIMESTAMP);
可以对每个连接设置当前的时区,相关描述参见。TIMESTAMP值以UTC格式保存,存储时对当前的时区进行转换,检索时再转换回当前的时区。只要时区设定值为常量,便可以得到保存时的值。如果保存一个TIMESTAMP值,应更改时区然后检索该值,它与你保存的值不同。这是因为在两个方向的转换中没有使用相同的时区。当前的时区可以用作time_zone系统变量的值。
可以在TIMESTAMP列的定义中包括NULL属性以允许列包含NULL值。例如:
CREATE TABLE t
ts1 TIMESTAMP NULL DEFAULT NULL,
ts2 TIMESTAMP NULL DEFAULT 0,
ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
如果未指定NULL属性,将列设置为NULL设置则会将它设置为当前的时间戳。请注意允许NULL值的TIMESTAMP列不会采用当前的时间戳,除非要么其
默认值定义为CURRENT_TIMESTAMP,或者NOW()或CURRENT_TIMESTAMP被插入到该列内。换句话说,只有使用如下定义创建,定义为
NULL的TIMESTAMP列才会自动更新:
CREATE TABLE t (ts NULLDEFAULT CURRENT_TIMESTAMP);
否则-也就是说,如果使用NULL而不是DEFAULT
TIMESTAMP来定义TIMESTAMP列,如下所示...
CREATE TABLE t1 (ts NULL DEFAULT NULL);
CREATE TABLE t2 (ts NULL DEFAULT ' 00:00:00');
...则必须显式插入一个对应当前日期和时间的值。例如:
INSERT INTO t1 VALUES (NOW());
INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
11.3.2. TIME类型
MySQL以'HH:MM:SS'格式检索和显示TIME值(或对于大的小时值采用'HHH:MM:SS'格式)。TIME值的范围可以从'-838:59:59'到'838:59:59'。小时部分会因此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)。
你可以用各种格式指定TIME值:
HH:MM:SS.fraction'格式的字符串。还可以使用下面任何一种“非严格”语法:'HH:MM:SS.fraction'、'HH:MM:SS'、'HH:MM'、'D
HH:MM:SS'、'D HH:MM'、'D
HH'或'SS'。这里D表示日,可以取0到34之间的值。请注意MySQL还不保存分数。
'HHMMSS'格式的没有间割符的字符串,假定是有意义的时间。例如,'101112'被理解为'10:11:12',但'109712'是不合法的(它有一个没有意义的分钟部分),将变为'00:00:00'。
HHMMSS格式的数值,假定是有意义的时间。例如,101112被理解为'10:11:12'。下面格式也可以理解:SS、MMSS、HHMMSS、HHMMSS.fraction。请注意MySQL还不保存分数。
函数返回的结果,其值适合TIME上下文,例如CURRENT_TIME。
对于指定为包括时间部分间割符的字符串的TIME值,如果时、分或者秒值小于10,则不需要指定两位数。'8:3:2'与'08:03:02'相同。
为TIME列分配简写值时应注意。没有冒号,MySQL解释值时假定最右边的两位表示秒。(MySQL解释TIME值为过去的时间而不是当天的时间)。例如,你可能认为'1112'和1112表示'11:12:00'(11点过12分),但MySQL将它们解释为'00:11:12'(11分,12
秒)。同样,'12'和12 被解释为
'00:00:12'。相反,TIME值中使用冒号则肯定被看作当天的时间。也就是说,'11:12'表示'11:12:00',而不是'00:11:12'。
超出TIME范围但合法的值被裁为范围最接近的端点。例如,'-850:00:00'和'850:00:00'被转换为'-838:59:59'和'838:59:59'。
无效TIME值被转换为'00:00:00'。请注意由于'00:00:00'本身是一个合法TIME值,只从表内保存的一个'00:00:00'值还不能说出原来的值是
'00:00:00'还是不合法的值。
11.3.3. YEAR类型
YEAR类型是一个单字节类型用于表示年。
MySQL以YYYY格式检索和显示YEAR值。范围是。
可以指定各种格式的YEAR值:
四位字符串,范围为'1901'到'2155'。
四位数字,范围为。
两位字符串,范围为'00'到'99'。'00'到'69'和'70'到'99'范围的值被转换为和范围的YEAR值。
两位整数,范围为1到99。1到69和70到99范围的值被转换为和范围的YEAR值。请注意两位整数范围与两位字符串范围稍有不同,因为你不能直接将零指定为数字并将它解释为2000。你必须将它指定为一个字符串'0'或'00'或它被解释为0000。
函数返回的结果,其值适合YEAR上下文,例如NOW()。
非法YEAR值被转换为0000。
11.3.4. Y2K事宜和日期类型
MySQL本身对于2000年(Y2K)是安全的(参见),但输入给MySQL的值可能不安全。任何包含两位年值的输入都会令人模糊,因为世纪不知道。这些值必须解释为四位形式,因为MySQL内部使用四位来保存年。
对于DATETIME、DATE、TIMESTAMP和YEAR类型,MySQL使用以下规则解释含模糊年值的日期:
00-69范围的年值转换为。
70-99范围的年值转换为。
请记住这些规则只是合理猜测数据值表示什么。如果MySQL使用的启发不能产生正确的值,你应提供包含四位年值的确切输入。
BY可以正确排序有两位年的TIMESTAMP或YEAR值。
部分函数如MIN()和MAX()将TIMESTAMP或YEAR转换为一个数字。这说明使用有两位年值的值,这些函数不能工作正确。在这种情况下的修复方法是将TIMESTAMP或YEAR转换为四位年格式或使用MIN(DATE_ADD(TIMESTAMP,INTERVAL
0 DAYS))。
阅读(12808) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。Sql Server基础:数据类型详解 - 文章 - 伯乐在线
& Sql Server基础:数据类型详解
数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型、数值类型以及日期类型等。数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为不同的类型可以节省磁盘空间和资源。
Sql Server 还能自动限制每个数据类型的取值范围,例如定义了一个类型为int的字段,如果插入数据时插入的值的大小在smallint或者tinyint范围之内, Sql Server 会自动将类型转换为smallint 或者tinyint,这样一来,在存储数据时,占用的存储空间只有int的1/2或则1/4.
Sql Server数据库管理系统中的数据类型可以分为两类,分别是:系统默认的数据类型和用户自定义的数据类型。下面分别介绍这两大类数据类型的内容.
一:系统数据类型
Sql Server 提供的系统数据类型有一下几大类,共25种。 Sql Server会自动限制每个系统数据类型的取值范围,当插入数据库中的值 超过了数据允许的范围时, Sql Server 就会报错。
1.整数数据类型
整数数据类型是常用的数据类型之一,主要用于存储数值,可以直接进行数据运算而不必使用函数转换.
(1).bigint
每个bigint存储在8个字节中,其中一个二进制位表示符号位,其它63个二进制位表示长度和大小,可以表示-2的63次方~2的63次方-1范围内的所有整数。
int或者integer,每个int存储在4个字节中,其中一个二进制位表示符号位,其它31个二进制位表示长度和大小,,可以表示-2的31次方~2的31次方-1范围内的所有整数。
(3).smallint
每个smallint类型的数据占用了两个字节的存储空间,其中一个二进制位表示整数值的正负号,其它15个二进制位表示长度和大小,,可以表示-2的15次方~2的15次方-1范围内的所有整数。
(4).tinyint
每个tinyint类型的数据占用了一个字节的存储空间,可以表示0~255范围内的所有整数.
2.浮点数据类型
浮点数据类型存储十进制小数,用于表示浮点数值数据的大致数值数据类型。浮点数据为近似值;浮点数值的数据则Sql Server中采用了只入不舍的方式进行存储,即当且仅当要舍入的数是一个非零数时,对其保留数字部分的最低有效位上加1,并进行必要的近位。
可以存储正的或者负的十进制数值,它的存储范围从-3.40E+38~-1.18E-38、0以及1.18E-38~3.40E+38.每个real类型的数据占用4个字节的存储空间。
(2)float[(n)]
其中为用于存储float数值尾数的位数(以科学计数法表示),因此可以确定精度和存储大小。如果指定了n它必须是介于1和53之间的某个值。n的默认值为53.
其范围从-1.79E+308~-2.23E-308、0以及2.23E+308~1.79E-308。如果不指定数据类型float的长度,它占用8个字节的存储空间。float数据类型可以写成float(n)的形式,n为指定float数据的精度,n为1~53之间的整数值。当n取1~24时,实际上定义了一个real类型的数据,系统用4个自己存储它。当n取25~53时,系统认为其是float类型,用8个字节存储它。
(3).decimal[(p[,s])]和numeric[(p[,s])
带固定精度和小数位数的数值数据类型。使用最大精度时,有效值从-10^38+1~10^38-1。numeric在功能上等价于decimal。
p(精度)指定了最多可以存储十进制数字的总位数,包括小数点左边和右边的位数,该精度必须是从1到最大精度38之间的值,默认精度为18.
s(小数位数)指定小数点右边可以存储的十进制数字的最大位数,小数位数必须是从0到p之间的值,仅在指定精度后才可以指定小数的位数。默认小数位数是0;因此,0&=s&=p。最大存储大小基于精度而变化。例如:decimal(10,5)表示共有10位数,其中整数5位,小数5位。
3.字符数据类型
字符数据类也是Sql Server中最常用的数据类型之一,用来存储各种字符,数字符号和特殊符号。在使用字符数据类型时,需要在其前后加上英文单引号或者双引号。
(1)char(n)
当用char数据类型存储数据时,每个字符和符号占用一个字节存储空间,n表示所有字符所占的存储空间,n的取值为1~8000。如不指定n的值,系统默认n的值为1。若输入数据的字符串长度小于n,则系统自动在其后添加空格来填满设定好的空间;若输入的数据过长,则会截掉其超出部分。
(2). varhcar(n|max)
n为存储字符的最大长度,其取值范围是1~8000,但可根据实际存储的字符数改变存储空间,max表示最大存储大小是2的31次方-1个字节。存储大小是输入数据的实际长度加2个字节。所输入数据的长度可以为0个字符。如varchcar(20),则对应的变量最多只能存储20个字符,不够20个字符的按实际存储。
(3).nchar(n)
n个字符的固定长度Unicode字符数据。n值必须在1~4000之间(含),如果没有数据定义的或变量声明语句中指定n,默认长度为1。此数据类型采用Unicode字符集,因此每一个存储单位占两个字节,可将全世界文字囊括在内(当然除了部分生僻字)。
(4)nvarchar(n|max)
与varchar类似,存储可变长度Unicode字符数据。n值必须在1~4000之间(含),如果没有数据定义的或变量声明语句中指定n,默认长度为1。max指最大存储大小为2的31次方-1字节。存储大小是输入字符个数的两倍+2个字节。所输入的数据长度可以为0个字符.
4.日期和时间数据类型
存储用字符串表示的日期数据,可以表示~(公元元年1月1日到公元日)间的任意日期值。数据格式为“YYYY-MM-DD”:
YYYY:表示年份的四位数字,范围为;
MM:表示指定年份中月份的两位数字,范围为01~12;DD:表示指定月份中某一天的两位数字,范围为01~31(最高值取决于具体月份)
该数据类型占用3个字节的空间。
以字符串形式记录一天的某个时间,取值范围为00:00:00.:59:59.9999999,数据格式为“hh:mm:ss[.nnnnnnn]”:
hh:表示小时的两位数字,范围为0~23。
mm:表示分钟的两位数字,范围为0~59。
ss:表示秒的两位数字,范围为0~59。
n*是0~7为数字,范围为0~9999999,它表示秒的小部分.
time值在存储时占用5个字节的空间。
(3).datetime
用于存储时间和日期数据,从日到日,默认值为 00:00:00,当插入数据或在其它地方使用时,需用单引号或双引号括起来。可以使用“/”、“-”和“.”作为分隔符。该类型数据占用8个字节的空间。
(4).datetime2
datetime的扩展类型,其数据范围更大,默认的最小精度最高,并具有可选的用户定义的精度。默认格式为:YYYY-MM-DD hh:mm:ss[.fractional seconds],日期的存取范围是~(公元元年1月1日到公元日).
(5).smalldatetime
smalldatetime类型与datetime类型相似,只是其存储范围是从日到日,当日期时间精度较小时,刻印使用smalldatetime,该类型数据占用4个字节的存储空间。
(6).datetimeoffset
用于定义一个采用24小时制与日期相组合并可识别时区的时间。默认格式是:“YYYY-MM-DD hh:mm:ss[.nnnnnnn][{+|-}hh:mm]”:
hh:两位数,范围是-14~14
mm:两位数,范围为00~59;
这里hh是时区偏移量,该类型数据中保存的是世界标准时间(UTC)值,eg:要存储北京时间日12点整,存储时该值将是 12:00:00+08:00,因为北京处于东八区,比UTC早8个小时。存储该数据类型数据时默认占用10个字节大小的固定存储空间.
5.文本和图形数据类型
用于存储文本数据,服务器代码页中长度可变的非Unicode数据,最大长度为2的31次方-1()个字符。当服务器代码页使用双字节字符时,存储仍是字节。
与text类型作用相同,为长度可变的非Unicode数据,最大长度为2的30次方-1()个字符。存储大小是所输入字符个数的两倍(以字节为单位).
长度可变的二进制数据,范围为:0~2的31次方-1个字节。用于存储照片、目录图片或者图画,容量也是个字节,由系统根据数据的长度自动分配空间,存储该字段的数据一般不能使用insert语句直接输入。
6.货币数据类型
用于存储货币值,取值范围为正负922 337 213 685 477.580 8之间。money数据类型中整数部分包含19个数字,小数部分包含4个数字,因此money数据类型的精度是19,存储时占用8个字节的存储空间。
(2).smallmoney
与money类型相似,取值范围为214 748.346 8之间,smallmoney存储时占用4个字节存储空间。输入数据时在前面加上一个货币符号,如人民币为¥或其它定义的货币符号。
7.位数据类型
bit称为位数据类型,只取0或1为值,长度1字节。bit值经常当作逻辑值用于判断true(1)或false(0),输入非0值时系统将其替换为1。
8.二进制数据类型
(1)binary(n)
长度为n个字节的固定长度二进制数据,其中n是从1~8000的值。存储大小为n个字节。在输入binary值时,必须在前面带0x,可以使用0xAA5代表AA5,如果输入数据长度大于定于的长度,超出的部分会被截断。
(2).varbinary(n|max)
可变长度二进制数据。其中n是从1~8000的值,max指示存储大小为2的31次方-1字节。存储大小为所输入数据的实际长度+2个字节。
在定义的范围内,不论输入的时间长度是多少,binary类型的数据都占用相同的存储空间,即定义时空间,而对于varbinary类型的数据,在存储时实际值的长度使用存储空间.
9.其他数据类型
(1).rowversion
每个数据都有一个计数器,当对数据库中包含rowversion列的表执行插入或者更新操作时,该计数器数值就会增加。此计数器是数据库行版本。一个表只能有一个rowversion列。每次修改或者插入包含rowversion列的行时,就会在rowversion列中插入经过增量的数据库行版本值。
公开数据库中自动生成的唯一二进制数字的数据类型。rowversion通常用作给表行加版本戳的机制。存储大小为8个字节。rowversion数据类型只是递增的数字,不保留日期或时间。
(2)timestamp
时间戳数据类型,timestamp的数据类型为rowversion数据类型的同义词,提供数据库范围内的唯一值,反映数据修改的唯一顺序,是一个单调上升的计数器,此列的值被自动更新。
在create table或alter table 语句中不必为提么timestamp数据类型指定列名。
eg:create table testTable (id int primary key,timestamp );
此时Sql Server数据库引擎将生成timestamp列名;但rowversion不具备这样的行为,在使用rowversion时,必须指定列名.
(3).uniqueidentifier
16字节的GUID(Globally Unique Identifier,全球唯一标识符),是Sql Server根据网络适配器地址和主机CPU时钟产生的唯一号码,其中,每个为都是0~9或a~f范围内的十六进制数字。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF,此号码可以通过newid()函数获得,在全世界各地的计算机由次函数产生的数字不会相同。
(4).cursor
游标数据类型,该类型类似与数据表,其保存的数据中的包含行和列值,但是没有索引,游标用来建立一个数据的数据集,每次处理一行数据。
(5).sql_variant
用于存储除文本,图形数据和timestamp数据外的其它任何合法的Sql Server数据,可以方便Sql Server的开发工作。
用于存储对表或视图处理后的结果集。这种新的数据类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便、快捷。
存储xml数据的数据类型。可以在列中或者xml类型的变量中存储xml实例。存储的xml数据类型表示实例大小不能超过2GB。
二:自定义数据类型
Sql Server允许用户自定义数据类型,用户自定义数据类型是建立在Sql Server系统数据类型的基础上的,自定义的数据类型使得数据库开发人员能够根据需要定义符合自己开发需求的数据类型。自定义数据类型虽然使用比较方便,但是需要大量的性能开销,所以使用时要谨慎。当用户定义一种数据类型时,需要指定该类型的名称、所基于的系统数据类型以及是否允许为空等。Sql Server为用户提供了两种方法来创建自定义数据类型。下面分别介绍这两种个定义数据类型的方法。
(1).使用对象资源管理器创建用户自定义数据类型
创建数据库Test&#8211;&【可编程性】&#8211;&【类型】节点,右击【用户定义数据类型】节点,在弹出的框中,按照说明相应操作即可。很简单,就不截图赘述了。
(2).使用存储过程创建用户自定义数据类型
触雷使用图形界面创建自定义数据类型,Sql Server中的系统存储过程sp_addtype也可为用户提供使用T_sql语句创建自定义数据类型的方法。其语法如下:
sp_addtype [@typename= ] type,
[@phystyle=] system_data_type
[,[@nulltype =] 'null_type']
sp_addtype [@typename= ] type,
[@phystyle=] system_data_type
[,[@nulltype =] 'null_type']
其中,各参数的含义如下:
type:用于指定用户定义的数据类型的名称。
system_data_type:用于指定相应的系统提供的数据类型的名称及定义。注意:未能使用timestamp数据类型,当所使用的系统数据类型有额外的说明时,需要用引号将其括起来。
null_type:用于指定用户自定义的的数据类型的null属性,其值可为“null” 、“not null“或”notnull“。默认时与系统默认的null属性相同。用户自定义的数据类型的名称在数据库中应该是唯一的。
eg:sp_addtype homeAddress &#8216;varchar(120)&#8217;,&#8217;not null&#8217;
删除用户自定义数据类型:
a.用图形界面删除,不做赘述。
b.用系统存储过程sp_droptype删除. eg:sp_droptype homeAddress,其中homeAddress为用户自定义数据类型名称.
注意:数据库正在使用的用户自定义数据类型,不能被删除。
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
&#8211; 好的话题、有启发的回复、值得信赖的圈子
&#8211; 分享和发现有价值的内容与观点
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 翻译传播优秀的外文文章
&#8211; 国内外的精选文章
&#8211; UI,网页,交互和用户体验
&#8211; 专注iOS技术分享
&#8211; 专注Android技术分享
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
& 2017 伯乐在线

我要回帖

更多关于 数据库存储 的文章

 

随机推荐