论文部分内容阅读
摘要:本文主要讨论了Mysql数据库和Mssql系列数据库提供的几种SQL数据字段类型的不同定义、应用以及如何在不同类型字段之间转化的问题。
关键词:Mysql;Mssql;数据类型
中图分类号:TP311 文献标识码:A文章编号:1009-3044(2007)03-10632-01
1 引言
我们在创建表之前首先要讲一下数据库提供SQL数据字段类型的问题,因为在实际应用中它是建表重要的一项环节。如何真实有地效表示现实世界某实体某一属性;如何尽可能地使用最有效(最小)的类型,来节省存贮空间,如何在不同类型字段之间转化数据等都要求我们对数据库提供字段类型要有的充分了解。但是不同数据库管理系统提供商对自己的数据库字段类型的定义有所不同,但是我们不用担心,基本的是相同。
存贮在数据库中表的数据字段类型,一般分为数字类型(整形、小数型)、日期和时间类型、字符串(字符)类型,其中常见的类型有整形、字符型、浮点型在过程化语言中大家应该很熟悉了,對日期和时间字段类型,可以看作是整型或字符型的扩展出来的。
首先介绍一下整形字段类型,在现实世界很多计数类型要整型数据表示,我们要根据实际情况选择适当长度类型。下面表格列出Mysql和Mssql数据库管理系统整形数据的一些情况:
表1
说明:在Mysql中可以用UNSIGNED声明整形字段为无符号类型,在Mssql似乎没有这个功能。Mysql数据库中没有bit类型。虽然两个数据库就整形类型表示有所不同,但是其核心内容是一样的。根据上面对整型字段的说明,我们应该明白要表示一个介于1和99999之间值的整数列,在Mysql中最好用 MEDIUMINT UNSIGNED类型比较好。
2 字符类型
在Mysql数据库中的字符类型只有char、varchar、text(Mysql中还有tinytext和bigtext类型,只是在字段长短上不同,Mssql只有一种text类型,具体他们长度区别请参看相关资料),对于Mssql另有nchar、nvarchar、ntext字符类型字段。下面我主要讲一下他们之间主要区别:char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。比如分别向定义char(8)和varchar(8)的字段中插入字符串“abc”,char实际存储空间是8,而varchar实际存储空间是3。显然那些长度比较均匀的字符串最好用char类型存储,因为在索引、查找、比对时定长字符更好些。数据长短相差较多字段使用varchar比较节省空间。char和varchar是可以指定最大存储长度的字符串类型,text可以理解成最大存储长度确定存储比较字符段落的varchar类型。
nchar、nvarchar、ntext与char、varchar、text的区别主要前者是是非以Unicode数据存储,后者是以Unicode数据存储。那么什么是Unicode呢?它是字符一种编码方式,大家知道在ASCII编码中字符是以一个字节存储的,而汉字是以2个字符存储的,英文与汉字同时存在时容易造成混乱。Unicode字符集就是为了解决字符集这种不兼容的问题,把所有的字符都用两个字节表示,即英文字符也是用两个字节表示。这样看来主要存储汉字为主的字符串用uncode形式存储比较好些。
3 浮点型字段和货币类型字段
一般分为单精度和双精度,被用来标示近似数字的数据类型。小数类型字段NUMERIC和DECIMAL是同义词。货币值的精确表示是一个常见的问题,在Mysql,你应该使用DECIMAL(NUMERIC的一个同义词)类型,它作为一个字符串被存储,是未压缩(unpack)的浮点数字,值的每一位使用一个字符,这样不会发生精确性的损失。如果精确性不是太重要,DOUBLE(双精度)类型也是足够好的。在Mssql中还有money、smallmoney专门表示对精确要求比较高货币值。
4 日期和时间类型
日期和时间类型在实际应用中是经常要碰到一种类型,在Mysql中year、date、time,datetime,timestamp类型,在Mssql中有smalldatetime、datetime和timestamp。在这里我们着重介绍timestamp类型字段。一个timestamp类型的字段在对于插入一个记录或修改这个记录时它自动地被设置为操作的日期和时间。你也可以通过赋给它一个NULL值设置它为当前的日期和时间。这在对于新闻、文章的修改的时间的字段用此类型是非常有用的。由于每次插入或更新包含 timestamp 列的行时,timestamp 列中的值均会更新。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用。这样大大加大了系统对表主键和有关索引以及与主键相关的外键的维护。在Mssql中一个表只能有一个 timestamp 列,而在Mysql中可以允许多个timestamp 列,但是insert和update被操作时只有第一列timestamp被更新。在Mysql中timestamp 列允许用指定一个时间值插入,而Mssql中好像只能是当前时间值或者为NULL。smallint(19) UNSIGNED 在这里如果没有接触Mysql的人一定会被搞糊涂了,在Mssql里一般是这样定义的:col_name MEDIUMINT 而不会是像Mysql中这样定义,col_nameTINYINT[(M)] [UNSIGNED]中的19是表示什么。
在实际应用中正确选择字段类型是很重要的,如何真实表示显示字段属性,如何最有效地使用存储空间,这些都要设计到字段类型的知识。
比如试着在所有的情况下使用最精确的类型。
对于同一类型,比如浮点性一般有单精度和双精度之分,在不同的RDBMS他们的存储字节数有所不同,在Mysql数据库中如下:
表2
DOUBLE、DOUBLE PRECISION、REAL都是双精度的表示方法。其实同一回事。
根据所表达的精度不同单精度度和双精度,选择相应长度,你总是能变换到以一个BIGINT存储的定点类型。这允许你用整数做所有的计算,并且仅在必要时将结果转换回浮点值。
Mysql字段类型中讲到BLOB是一个能保存可变数量的数据的二进制的大对象。一个BLOB是一个能保存可变数量的数据的二进制的大对象。
那么blob类型是否可以存贮图片等二进制数据?
其宽度小于列指定宽度的值得左填补显示,但是不限制能在列中被存储的值的范围,也不限制值将被显示的位数对于声明为INT(5) ZEROFILL的列,一个为4的值作为00004被检索。
参考文献:
[1]丁宝康. 数据库实用教程[M].北京:清华大学出版社.2003.
[2]苗雪兰. 数据库系统原理及应用教程[m].北京:机械工业出版社.2004.
[3](美国)范斯瓦尼著、徐小青等译. MySQL完全手册[M].北京:电子工业出版社.2004.
[4](美国)吉尔费伦著、王军等译.MySQL4从入门到精通[M].北京:电子工业出版社.2003.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:Mysql;Mssql;数据类型
中图分类号:TP311 文献标识码:A文章编号:1009-3044(2007)03-10632-01
1 引言
我们在创建表之前首先要讲一下数据库提供SQL数据字段类型的问题,因为在实际应用中它是建表重要的一项环节。如何真实有地效表示现实世界某实体某一属性;如何尽可能地使用最有效(最小)的类型,来节省存贮空间,如何在不同类型字段之间转化数据等都要求我们对数据库提供字段类型要有的充分了解。但是不同数据库管理系统提供商对自己的数据库字段类型的定义有所不同,但是我们不用担心,基本的是相同。
存贮在数据库中表的数据字段类型,一般分为数字类型(整形、小数型)、日期和时间类型、字符串(字符)类型,其中常见的类型有整形、字符型、浮点型在过程化语言中大家应该很熟悉了,對日期和时间字段类型,可以看作是整型或字符型的扩展出来的。
首先介绍一下整形字段类型,在现实世界很多计数类型要整型数据表示,我们要根据实际情况选择适当长度类型。下面表格列出Mysql和Mssql数据库管理系统整形数据的一些情况:
表1
说明:在Mysql中可以用UNSIGNED声明整形字段为无符号类型,在Mssql似乎没有这个功能。Mysql数据库中没有bit类型。虽然两个数据库就整形类型表示有所不同,但是其核心内容是一样的。根据上面对整型字段的说明,我们应该明白要表示一个介于1和99999之间值的整数列,在Mysql中最好用 MEDIUMINT UNSIGNED类型比较好。
2 字符类型
在Mysql数据库中的字符类型只有char、varchar、text(Mysql中还有tinytext和bigtext类型,只是在字段长短上不同,Mssql只有一种text类型,具体他们长度区别请参看相关资料),对于Mssql另有nchar、nvarchar、ntext字符类型字段。下面我主要讲一下他们之间主要区别:char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。比如分别向定义char(8)和varchar(8)的字段中插入字符串“abc”,char实际存储空间是8,而varchar实际存储空间是3。显然那些长度比较均匀的字符串最好用char类型存储,因为在索引、查找、比对时定长字符更好些。数据长短相差较多字段使用varchar比较节省空间。char和varchar是可以指定最大存储长度的字符串类型,text可以理解成最大存储长度确定存储比较字符段落的varchar类型。
nchar、nvarchar、ntext与char、varchar、text的区别主要前者是是非以Unicode数据存储,后者是以Unicode数据存储。那么什么是Unicode呢?它是字符一种编码方式,大家知道在ASCII编码中字符是以一个字节存储的,而汉字是以2个字符存储的,英文与汉字同时存在时容易造成混乱。Unicode字符集就是为了解决字符集这种不兼容的问题,把所有的字符都用两个字节表示,即英文字符也是用两个字节表示。这样看来主要存储汉字为主的字符串用uncode形式存储比较好些。
3 浮点型字段和货币类型字段
一般分为单精度和双精度,被用来标示近似数字的数据类型。小数类型字段NUMERIC和DECIMAL是同义词。货币值的精确表示是一个常见的问题,在Mysql,你应该使用DECIMAL(NUMERIC的一个同义词)类型,它作为一个字符串被存储,是未压缩(unpack)的浮点数字,值的每一位使用一个字符,这样不会发生精确性的损失。如果精确性不是太重要,DOUBLE(双精度)类型也是足够好的。在Mssql中还有money、smallmoney专门表示对精确要求比较高货币值。
4 日期和时间类型
日期和时间类型在实际应用中是经常要碰到一种类型,在Mysql中year、date、time,datetime,timestamp类型,在Mssql中有smalldatetime、datetime和timestamp。在这里我们着重介绍timestamp类型字段。一个timestamp类型的字段在对于插入一个记录或修改这个记录时它自动地被设置为操作的日期和时间。你也可以通过赋给它一个NULL值设置它为当前的日期和时间。这在对于新闻、文章的修改的时间的字段用此类型是非常有用的。由于每次插入或更新包含 timestamp 列的行时,timestamp 列中的值均会更新。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用。这样大大加大了系统对表主键和有关索引以及与主键相关的外键的维护。在Mssql中一个表只能有一个 timestamp 列,而在Mysql中可以允许多个timestamp 列,但是insert和update被操作时只有第一列timestamp被更新。在Mysql中timestamp 列允许用指定一个时间值插入,而Mssql中好像只能是当前时间值或者为NULL。smallint(19) UNSIGNED 在这里如果没有接触Mysql的人一定会被搞糊涂了,在Mssql里一般是这样定义的:col_name MEDIUMINT 而不会是像Mysql中这样定义,col_nameTINYINT[(M)] [UNSIGNED]中的19是表示什么。
在实际应用中正确选择字段类型是很重要的,如何真实表示显示字段属性,如何最有效地使用存储空间,这些都要设计到字段类型的知识。
比如试着在所有的情况下使用最精确的类型。
对于同一类型,比如浮点性一般有单精度和双精度之分,在不同的RDBMS他们的存储字节数有所不同,在Mysql数据库中如下:
表2
DOUBLE、DOUBLE PRECISION、REAL都是双精度的表示方法。其实同一回事。
根据所表达的精度不同单精度度和双精度,选择相应长度,你总是能变换到以一个BIGINT存储的定点类型。这允许你用整数做所有的计算,并且仅在必要时将结果转换回浮点值。
Mysql字段类型中讲到BLOB是一个能保存可变数量的数据的二进制的大对象。一个BLOB是一个能保存可变数量的数据的二进制的大对象。
那么blob类型是否可以存贮图片等二进制数据?
其宽度小于列指定宽度的值得左填补显示,但是不限制能在列中被存储的值的范围,也不限制值将被显示的位数对于声明为INT(5) ZEROFILL的列,一个为4的值作为00004被检索。
参考文献:
[1]丁宝康. 数据库实用教程[M].北京:清华大学出版社.2003.
[2]苗雪兰. 数据库系统原理及应用教程[m].北京:机械工业出版社.2004.
[3](美国)范斯瓦尼著、徐小青等译. MySQL完全手册[M].北京:电子工业出版社.2004.
[4](美国)吉尔费伦著、王军等译.MySQL4从入门到精通[M].北京:电子工业出版社.2003.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。