mysql 数据类型的详解

mysql 数据类型的详解,第1张

MySQL数据库的表是一个二维表,由一个或多个数据列构成。

每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。

MySQL中的列类型有三种:数值类、字符串类和日期/时间类。

从大类来看列类型和数值类型一样,都是只有三种。但每种列类型都还可细分。

下面对各种列类型进行详细介绍。

数值类的数据列类型

数值型的列类型包括整型和浮点型两大类。

TINYINT:1字节 非常小的正整数,带符号:-128~127,不带符号:0~255

SMALLINT:2字节 小整数,带符号:-32768~32767,不带符号:0~65535

MEDIUMINT:3字节 中等大小的整数,带符号:-8388608~8388607,不带符号:0~16777215

INT:4字节 标准整数,带符号:-2147483648~2147483647,不带符号:0~4294967295

BIGINT:8字节 大整数,带符号:-9223372036854775808~9233372036854775807,不带符号:0~18446744073709551615

FLOAT:4字节 单精度浮点数,最小非零值:+-1175494351E-38,最大非零值:+-3402823466E+38

DOUBLE:8字节 双精度浮点数,最小非零值:+-22250738585072014E-308,最大非零值:+-17976931348623157E+308

DECIMAL:M+2字节 以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。

MYSQL支持大量的列类型,它们可以被分为 3 类:数字类型、日期和时间类型以及字符串(字符)类型。这个章节首先给出可用类型的概述,并且总结各类型所需的存储需求,然后提供各类型中的类型范畴更详细的描述。概述有意地简化了。更详细的说明应该参考特写列类型的附加信息,例如你能为其指定值的允许格式。

MySQL 支持的列类型在下面列出。下列代码字母用于描述中:

M指出最大的显示尺寸。最大的显示尺寸长度为 255。D适用于浮点类型。指出跟随在十进制小数点后的数字数量。最大可能值为 30,但不应大于M-2。

方括号 (“[”and“]”) 指定可选的类型修饰部份。

注意,如果为一个列指定了ZEROFILL,MySQL 将自动为这个列添加UNSIGNED属性。

警告:你应该知道当在两个整数类型值中使用减法时,如有一个为UNSIGNED类型,那么结果也是无符号的。查看章节635 Cast 函数。

TINYINT[(M)] [UNSIGNED] [ZEROFILL]-128到127。无符号的范围是0到255。

BITBOOL它们是TINYINT(1)的同义词。

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]一个小整数。有符号的范围是-32768到32767。无符号的范围是0到65535。

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]一个中等大小的整数。有符号的范围是-8388608到8388607。无符号的范围是0到16777215。

INT[(M)] [UNSIGNED] [ZEROFILL]一个正常大小的整数。有符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。

INTEGER[(M)] [UNSIGNED] [ZEROFILL]INT的同义词。

BIGINT[(M)] [UNSIGNED] [ZEROFILL]一个大的整数。有符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。

你应该知道的有关BIGINT列的一些事情:

BIGINT或DOUBLE值来完成的,因此你不应该使用大于9223372036854775807(63 bits) 的无符号大整数,除了位函数之外!如果你这样做了,结果中的某些大数字可能会出错,因为将BIGINT转换成DOUBLE时产生了舍入错误。MySQL 40 在下列情况下可以处理BIGINT:

在一个BIGINT列中使用整数存储一个大的无符号值。

在MIN(big_int_column)和MAX(big_int_column)中。

当两个 *** 作数都是整数时使用 *** 作符 (+、-、、等)。

通常你可以在一个BIGINT列中以字符串方式存储的一个精确的整数。在这种情况下,MySQL 将执行一个字符串到数字的转换,包括无 intermediate 的双精度表示法。

当两个参数均是整数值时,“-”、“+”和“”将使用BIGINT运算!这就意味着,如果两个大整数的乘积(或函数的结果返回整数)的结果大于9223372036854775807时,你可能会得到意想不到的结果。

FLOAT(precision) [UNSIGNED] [ZEROFILL]一个浮点型数字。

precision可以是<=24作为一个单精度的浮点数字和介于 25 和 53 之间作为一个双精度的浮点数字。这些类型与下面描述的FLOAT和DOUBLE类型相似。FLOAT(X)有与相应的FLOAT和DOUBLE类型同样的范围,但是显示尺寸和十进制小数位数是未定义的。在 MySQL 323 中,它是一个真实的浮点值。而在 MySQL 早期的版本中,FLOAT(precision)通常有 2 小数位。 注意,由于在 MySQL 中所有的计算都是以双精度执行的,所以使用FLOAT可能带来一些意想不到的问题。查看章节A56 解决没有匹配行的问题。

FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]一个小的(单精度) 浮点数字。允许的值是-3402823466E+38到-1175494351E-38、0和1175494351E-38到3402823466E+38。如果UNSIGNED被指定,负值是不允许的。M是显示宽度,D是小数位数。FLOAT没有参数或有X<= 24 的FLOAT(X)代表一个单精度的浮点数字。

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]一个正常大小的(双精度)浮上数字。允许的值是-17976931348623157E+308到-22250738585072014E-308、0和22250738585072014E-308到17976931348623157E+308。如果UNSIGNED被指定,负值是不允许的。M是显示宽度,D是小数位数。DOUBLE没胡参数或有 25 <=X<= 53 的FLOAT(X)代表一个双精度的浮点数字。

DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]

REAL[(M,D)] [UNSIGNED] [ZEROFILL]它们是DOUBLE同义词。

DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]一个未压缩(unpacked)的浮点数。运作如同一个CHAR列:“unpacked” 意味着数字是以一个字符串存储的,值的每一位将使用一个字符。小数点并且对于负数,“-”符号不在M中计算(但是它们的空间是被保留的)。如果D是 0,值将没有小数点或小数部份。DECIMAL值的最大范围与DOUBLE一致,但是对于一个给定的DECIMAL列,实际的范围可以被所选择的M和D限制。如果UNSIGNED被指定,负值是不允许的。 如果D被忽略,缺省为 0。如果M被忽略,缺省为 10。 在 MySQL 323 以前,M参数必须包含符号与小数点所需的空间。

DEC[(M[,D])] [UNSIGNED] [ZEROFILL]

NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]DECIMAL的同义词。

DATE一个日期。支持的范围是'1000-01-01'到'9999-12-31'。MySQL 以'YYYY-MM-DD'格式显示DATE值,但是允许你以字符串或数字给一个DATE列赋值。查看章节6222DATETIME、DATE和TIMESTAMP类型。

DATETIME一个日期和时间的组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL 以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,但是允许你以字符串或数字给一个DATETIME列赋值。查看章节6222DATETIME、DATE和TIMESTAMP类型。

TIMESTAMP[(M)]一个时间戳。范围是'1970-01-01 00:00:00'到2037年间的任意时刻。 MySQL 40 和更早版本中,TIMESTAMP值是以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式显示的,它取决于M是否是14(或省略)、12、8或6,但是允许你以字符串或数字给一个TIMESTAMP列赋值。 从 MySQL 41 开始,TIMESTAMP以'YYYY-MM-DD HH:MM:DD'格式作为字符返回。如果你你希望以数字形式返回则必须在该时间戳字段后加上 +0。不同的时间戳长度是不支持的。从 MySQL 4012 开始,选项--new可以被用来使服务器与 41 一样运作。TIMESTAMP列有益于记录一个INSERT或UPDATE *** 作的日期和时间,因为如果你自己没有给它赋值,它将被自动地设置为最近一次 *** 作的日期和时间。也可以通过给它赋一个NULL而使它设置为当前的日期和时间。查看章节622 Date 和 Time 类型。 参数M只影响一个TIMESTAMP列的显示格式;它的值总是占用 4 个字节存储。 注意,当TIMESTAMP(M)列的M是 8 或 14 时,它返回的是数字而其它的TIMESTAMP(M)列返回的是字符串。这仅仅是为了可以可靠地转储并恢复到其它格式的表中。查看章节6222DATETIME、DATE和TIMESTAMP类型。TIME一个时间。范围是'-838:59:59'到'838:59:59'。MySQL 以'HH:MM:SS'格式显示TIME值,但是允许你使用字符串或数字来给TIME列赋值。查看章节6223TIME类型。YEAR[(2|4)]一个 2 或 4 位数字格式的年(缺省为 4 位)。允许的值是1901到2155、0000(4 位年格式) 以及使用 2 位格式的 1970-2069 (70-69)。MySQL 以YYYY格式显示YEAR值,但是允许你使用字符串或数字来给YEAR列赋值。(YEAR类型在 MySQL 322 之前不支持。) 查看章节6224YEAR类型。

[NATIONAL] CHAR(M) [BINARY]一个定长的字符串,当存储时,总是以空格填满右边到指定的长度。M的范围是 0 到 255 (在 MySQL 323 版本之前为 1 到 255)。当该值被检索时,尾部空格将被删除。CHAR值根据缺省的字符集进行忽略大小写的排索与比较,除非指定了关键词BINARY。NATIONAL CHAR(或短形式NCHAR) 是以 ANSI SQL 方式定义一个CHAR列,它将使用缺省的字符集。这在 MySQL 中是默认的。

CHAR是CHARACTER的缩写。 MySQL 允许以CHAR(0)类型建立一个列。一些老程序运行时必需一个列,却又并不使用这个列的值,你就不得不为了适应它而建立该列,在这情况下,CHAR(0)将是很有益的。当需要一个列仅保存两个值时:一个为CHAR(0)(该列没有定义为NOT NULL),这将仅占用一个比特位来存储 2 个值:NULL或""。查看章节6231CHAR和VARCHAR类型。CHAR这是CHAR(1)的同义词。

[NATIONAL] VARCHAR(M) [BINARY]一个变长的字符串。注意:尾部的空格在存储时将会被删除(这与 ANSI SQL 约规不同)。M的范围是 0 到 255 (在 MySQL 402 之前的版本中是 1 到 255)。

VARCHAR值以大小写忽略方式进行排索与比较,除非关键词BINARY被指定。查看章节6531 隐式的列定义变化。VARCHAR是CHARACTER VARYING的缩写。查看章节6231CHAR和VARCHAR类型。

TINYBLOBTINYTEXT一个BLOB或TEXT列,最大长度为 255 (2^8 - 1) 个字符。查看章节6531 隐式的列定义变化。查看章节6232BLOB和TEXT类型。

BLOBTEXT一个BLOB或TEXT列,最大长度为 65535 (2^16 - 1) 个字符。查看章节6531 隐式的列定义变化。查看章节6232BLOB和TEXT类型。

MEDIUMBLOBMEDIUMTEXT一个BLOB或TEXT列,最大长度为 16777215 (2^24 - 1) 个字符。查看章节6531 隐式的列定义变化。查看章节6232BLOB和TEXT类型。

LONGBLOBLONGTEXT一个BLOB或TEXT列,最大长度为 4294967295 (2^32 - 1) 个字符。查看章节6531 隐式的列定义变化。注意,由于服务器/客户端的协议以及 MyISAM 表通常有一个 16M 每通信包/表行的限制,你仍然不能使用这个类型的整个范围。查看章节6232BLOB和TEXT类型。ENUM('value1','value2',)一个枚举类型。一个仅能有一个值的字符串对象,这个值选自值列'value1'、'value2'、、NULL或特殊的""出错值。一个ENUM列可以有最大 65535 不同的值。查看章节6233ENUM类型。SET('value1','value2',)一个集合。一个能有零个或更多个值的字符串对象,其中每个值必须选自值列'value1'、'value2'、。一个SET列可以有最大 64 个成员。查看章节6234SET类型。

MySQL 支持所有的 ANSI/ISO SQL92 数字类型。这些类型包括准确数字的数据类型(NUMERIC、DECIMAL、INTEGER和SMALLINT),也包括近似数字的数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键词INT是INTEGER的同义词,关键词DEC是DECIMAL的同义词。

NUMERIC和DECIMAL类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。当以它们中的之一声明一个列时,精度和数值范围可以(通常是)被指定;例如:

salary DECIMAL(5,2)

在这个例子中,5(精度(precision)) 代表重要的十进制数字的数目,2(数据范围(scale)) 代表在小数点后的数字位数。在这种情况下,因此,salary列可以存储的值范围是从-9999到9999。(实际上 MySQL 在这个列中可以存储的数值可以一直到99999,因为它没有存储正数的符号)。

译者注:

M 与D 对DECIMAL(M, D) 取值范围的影响

类型说明 取值范围(MySQL < 323) 取值范围(MySQL >= 323)

DECIMAL(4, 1) -99 到 999 -9999 到 99999

DECIMAL(5, 1) -999 到 9999 -99999 到 999999

DECIMAL(6, 1) -9999 到 99999 -999999 到 9999999

DECIMAL(6, 2) -9999 到 99999 -999999 到 9999999

DECIMAL(6, 3) -9999 到 99999 -999999 到 9999999

# 在MySQL 323 及以后的版本中,DECIMAL(M, D) 的取值范围等于早期版本中的DECIMAL(M + 2, D) 的取值范围。注释结束:

在 ANSI/ISO SQL92 中,句法DECIMAL(p)等价于DECIMAL(p,0)。同样的,在执行被允许决定值p的地方,句法DECIMAL等价于DECIMAL(p,0)。MySQL 目前还不支持DECIMAL/NUMERIC数据类型的这些变体形式中的任一种。一般来说这并不是一个严重的问题,通过明确地控制精度和数值范围可以得到这些类型的主要功能益处。

DECIMAL和NUMERIC值是作为字符串存储的,而不是作为二进制浮点数,以便保护这些值的十进制精确度。一个字符用于数值的每一位、小数点(如果scale> 0) 和“-”符号(对于负值)。如果scale是 0,DECIMAL和NUMERIC值不包含小数点或小数部分。

DECIMAL和NUMERIC值的最大范围与DOUBLE一致,但是对于一个给定的DECIMAL或NUMERIC列,它的实际范围可制定该列时的precision或scale限制。当这样的列被赋给了小数点的位数超过scale所指定的值时,该将根据scale进行四舍五入。当一个DECIMAL或NUMERIC列被赋与一个大小超过指定(或缺省)的precisionandscale的限止范围时,MySQL 以该列范围的端点值存储该值。

mysql资料库里的日期用timestamp还是datetime好 (1)4个位元组储存

(2)值以UTC格式储存

(3)时区转化 ,储存时对当前的时区进行转换,检索时再转换回当前的时区。

(4)TIMESTAMP值不能早于1970或晚于2037!

timestamp在资料库里实际记载的时间是国际标准时间,同一个timestamp值在不同的时区检索出来的日期时间是不一样的,因为系统会根据时区的不同进行自动时区转换,而datetime则不会进行转换时区转换,储存时是什么日期时间,检索出来的就是存入时的日期时间,它不会有变化。至于这两种日期时间型别哪种好是没有定论的,要根据实际情况和应用需求做出取舍。

请注意由于无需实施时区转换,系统处理dateime所产生的系统开销要比timestamp小。

没什么好不好的,方便省事才是王道。都用datetime 你说呢,谁在乎那点储存

型别

型别 储存需求 格式 时间范围

datetime 8个位元组 yyyy-mm-dd hh-mm-ss 1000-01-01 00:00:00 到9999-12-31 23:59:59 timestamp 4个位元组 yyyy-mm-dd hh-mm-ss 1970-01-01 00:00:00 到2037-12-31 23:59:59

timestamp型别会有时区变数的影响,跨时区使用时应注意

datetime 8个位元组 yyyy-mm-dd hh-mm-ss 1000-01-01 00:00:00 到9999-12-31 23:59:59

timestamp 4个位元组 yyyy-mm-dd hh-mm-ss 1970-01-01 00:00:00 到2037-12-31 23:59:59

timestamp型别会有时区变数的影响,跨时区使用时应注意

没什么好不好的,方便省事才是王道。都用datetime 你说呢,谁在乎那点储存 型别 型别 储存需求 格式 时间范围 datetime 8个位元组

Mysql中经常用来储存日期的资料型别有2种:Date、Datetime

1Date资料型别:用来储存没有时间的日期。Mysql获取和显示这个型别的格式为“YYYY-MM-DD”。支援的时间范围为“1000-00-00”到“9999-12-31”。

2Datetime型别:储存既有日期又有时间的资料。储存和显示的格式为 “YYYY-MM-DD HH:MM:SS”。支援的时间范围是“1000-00-00 00:00:00”到“9999-12-31 23:59:59”。

TIMESTAMP列用于INSERT或UPDATE *** 作时记录日期和时间。如果你不分配一个值,表中的第一个TIMESTAMP列自动设定为最近 *** 作的日期和时间。也可以通过分配一个NULL值,将TIMESTAMP列设定为当前的日期和时间。

TIMESTAMP值返回后显示为'YYYY-MM-DDHH:MM:SS'格式的字串,显示宽度固定为19个字元。如果想要获得数字值,应在TIMESTAMP列新增+0。

注释:MySQL41以前使用的TIMESTAMP格式在MySQL51中不支援;关于旧格式的资讯参见MySQL41参考手册。

datetime

1 占用8个位元组

2 允许为空值,可以自定义值,系统不会自动修改其值。

3 实际格式储存(Just stores what you have stored and retrieves the same thing which you have stored)

4 与时区无关(It has nothing to deal with the TIMEZONE and Conversion)

5 不可以设定预设值,所以在不允许为空值的情况下,必须手动指定datetime栏位的值才可以成功插入资料。

6 可以在指定datetime栏位的值的时候使用now()变数来自动插入系统的当前时间。

结论:datetime型别适合用来记录资料的原始的建立时间,因为无论你怎么更改记录中其他栏位的值,datetime栏位的值都不会改变,除非你手动更改它。

timestamp

1 占用4个位元组

2 允许为空值,但是不可以自定义值,所以为空值时没有任何意义。

3 TIMESTAMP值不能早于1970或晚于2037。这说明一个日期,例如'1968-01-01',虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个物件将被转换为0。

4值以UTC格式储存( it stores the number of milliseconds)

5时区转化 ,储存时对当前的时区进行转换,检索时再转换回当前的时区。

6 预设值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间。

7 资料库会自动修改其值,所以在插入记录时不需要指定timestamp栏位的名称和timestamp栏位的值,你只需要在设计表的时候新增一个timestamp栏位即可,插入后该栏位的值会自动变为当前系统时间。

8 以后任何时间修改表中的记录时,对应记录的timestamp值会自动被更新为当前的系统时间。

结论:timestamp型别适合用来记录资料的最后修改时间,因为只要你更改了记录中其他栏位的值,timestamp栏位的值都会被自动更新。

看完这个比较你就知道用哪个好啦

我们公司一般用datatime,可控性比较强

jdbc查询Mysql资料库的日期问题

你没说错!

查出来可以储存为String型别 具体转化一下就OK了

BBSXP 用的MYSQL资料库还是MSSQL资料库

BBSXP同时支援Aess资料库和MSSQL资料库

在Configasp档案里定义:

IsSqlDataBase=1 '定义资料库类别,0为Aess资料库,1为SQL资料库

不知道你是哪个版本,在BBSxp 2008 SP2里Configasp档案在根目录下。内容如下:

<%

InstallIPAddress="127001" '安装BBSXP的IP地址,针对installasp的访问许可权

TablePrefix="BBSXP_" '资料库表的前辍名(一般不用更改)

IsSqlDataBase=0 '定义资料库类别,0为Aess资料库,1为SQL资料库

If IsSqlDataBase=0 Then

'''''''''''''''''''''''''''''' Aess资料库设定 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''

SqlDataBase = "database/bbsxp2008mdb" '资料库路径

SqlProvider = "MicrosoftJetOLEDB40" '驱动程式[ MicrosoftJetOLEDB40 MicrosoftACEOLEDB120 ]

SqlPassword = "" 'ACCESS资料库密码

Connstr="Provider="&SqlProvider&";Jet Oledb:Database Password="&SqlPassword&"; Data Source="&ServerMapPath(SqlDataBase)

SqlNowString="Now()"

SqlChar="'"

IsSqlVer="ACCESS"

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Else

'''''''''''''''''''''''''''''' SQL资料库设定 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

SqlLocalName = "(local)" '连线IP [ 本地用 (local) 外地用IP ]

SqlUserName = "sa" 'SQL使用者名称

SqlPassword = "1234" 'SQL使用者密码

SqlDataBase = "bbsxp" '资料库名

SqlProvider = "SQLOLEDB" '驱动程式 [ SQLOLEDB SQLNCLI ]

ConnStr="Provider="&SqlProvider&"; User ID="&SqlUserName&"; Password="&SqlPassword&"; Initial CataLog="&SqlDataBase&"; Data Source="&SqlLocalName&";"

SqlNowString="GetDate()"

IsSqlVer="MSSQL"

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

End If

'''''''''''''''''''''''''' 以下为专业人员设定选项,普通使用者请勿修改 ''''''''''''''''''''''''''

SessionCodePage="936" '936(简体中文) 950(繁体中文) 65001(Unicode)

BBSxpCharset="GB2312" 'GB2312(简体中文) Big5(繁体中文) UTF-8(Unicode)

ResponseCharset=BBSxpCharset

ResponseBuffer=True

%>

注:

上面bbsxp7b1版本用的是Aess资料库,因为IsSqlDataBase=0

mysql资料库可以修改表的日期格式吗

日期型的栏位 储存的格式是固定的不可以修改, 需要输出时 转换成需要的格式, 如果你不想输出时转换 那么需要 设为字元型的, 储存时转换 总之 不管先转还是后转 ,一定要转

有,DATETIME类型就起到这个作用。在实际使用中也是这样作的。

一般是将DATETIME型日期置为0来表示。

例如:DECLARE @TIME DATETIME

SET @TIME='17:20:30'

什么叫时间长度?其实就是从0时间开始的“时间点”,所以

此时@TIME中存放的是从0时间(1900-01-01 00:00:00000)开始到某一时刻时间长度。

得用这个时间长度,您可以进行各种时间运算和显示。

也可以说,并没有单独的表示时间长度的数据类型。但DATETIME加上DATEADD,DATEDIFF等函数,可以方便地完成所有时间运算任务

(1) 整数型

整数包括bigint、int、smallint和tinyint,从标识符的含义就可以看出,它们的表示数范围逐渐缩小。

l bigint:大整数,数范围为 -263 (-9223372036854775808)~263-1 (9223372036854775807) ,其精度为19,小数位数为0,长度为8字节。

l int:整数,数范围为 -231 (-2,147,483,648) ~231 - 1 (2,147,483,647) ,其精度为10,小数位数为0,长度为4字节。

l smallint:短整数,数范围为 -215 (-32768) ~215 - 1 (32767) ,其精度为5,小数位数为0,长度为2字节。

l tinyint:微短整数,数范围为 0~255,长度为1字节,其精度为3,小数位数为0,长度为1字节。

(2) 精确整数型

精确整数型数据由整数部分和小数部分构成,其所有的数字都是有效位,能够以完整的精度存储十进制数。精确整数型包括decimal 和 numeric两类。从功能上说两者完全等价,两者的唯一区别在于decimal不能用于带有identity关键字的列。

声明精确整数型数据的格式是numeric | decimal(p[,s]),其中p为精度,s为小数位数,s的缺省值为0。例如指定某列为精确整数型,精度为6,小数位数为3,即decimal(6,3),那么若向某记录的该列赋值56342689时,该列实际存储的是563427。

decimal和numeric可存储从 -1038 +1 到 1038 –1 的固定精度和小数位的数字数据,它们的存储长度随精度变化而变化,最少为5字节,最多为17字节。

l 精度为1~9时,存储字节长度为5;

l 精度为10~19时,存储字节长度为9;

l 精度为20~28时,存储字节长度为13;

l 精度为29~38时,存储字节长度为17。

例如若有声明numeric(8,3),则存储该类型数据需5字节,而若有声明numeric(22,5),则存储该类型数据需13字节。

注意:声明精确整数型数据时,其小数位数必须小于精度;在给精确整数型数据赋值时,必须使所赋数据的整数部分位数不大于列的整数部分的长度。

(3) 浮点型

浮点型也称近似数值型。顾名思义,这种类型不能提供精确表示数据的精度,使用这种类型来存储某些数值时,有可能会损失一些精度,所以它可用于处理取值范围非常大且对精确度要求不是十分高的数值量,如一些统计量。

有两种近似数值数据类型:float[(n)]和real,两者通常都使用科学计数法表示数据,即形为:尾数E阶数,如56432E20,-298E10,1287659E-9等。

l real:使用4字节存储数据,表数范围为-340E + 38 到 340E + 38,数据精度为7位有效数字。

l float:定义中的n取值范围是1~53,用于指示其精度和存储大小。当n在1~24之间时,实际上是定义了一个real型数据,存储长度为4字节,精度为7位有效数字;当n在25~53之间时,存储长度为8字节,精度为15位有效数字。当缺省n时,代表n在25~53之间。float型数据的数范围为- 179E+308 到 179E+308。

(4) 货币型

SQL Server提供了两个专门用于处理货币的数据类型:money和smallmoney,它们用十进制数表示货币值。

l money:数据的数范围为-263 (-9223372036854775808)~263-1 (9223372036854775807) ,其精度为19,小数位数为4,长度为8字节。money的数的范围与bigint相同,不同的只是money型有4位小数,实际上,money就是按照整数进行运算的,只是将小数点固定在末4位。

l smallmoney:数范围为 –231 (-2,147,483648) ~231 - 1 (2,147,483647) ,其精度为10,小数位数为4,长度为4字节。可见smallmoney与int的关系就如同money与bigint的关系。

当向表中插入money或smallmoney类型的值时,必须在数据前面加上货币表示符号($),并且数据中间不能有逗号(,);若货币值为负数,需要在符号$的后面加上负号(-)。例如:$1500032,$680,$-200009088都是正确的货币数据表示形式。

(5) 位型

SQL Server中的位(bit)型数据相当于其他语言中的逻辑型数据,它只存储0和1,长度为一个字节。但要注意,SQL Server对表中bit类型列的存储作了优化:如果一个表中有不多于 8 个的bit列,这些列将作为一个字节存储,如果表中有 9 到 16 个 bit 列,这些列将作为两个字节存储,更多列的情况依此类推。

当为bit类型数据赋0时,其值为0,而赋非0(如100)时,其值为1。

若表中某列为bit类型数据,那么该列不允许为空值(有关空值概念本节稍后即做介绍),并且不允许对其建立索引。

(6) 字符型

字符型数据用于存储字符串,字符串中可包括字母、数字和其它特殊符号(如#、@、&等等)。在输入字符串时,需将串中的符号用单引号或双引号括起来,如’abc’、”Abc<Cde”。

SQL Server字符型包括两类:固定长度 (char) 或可变长度 (varchar) 字符数据类型。

l char[(n)]

定长字符数据类型,其中n定义字符型数据的长度,n在1到8000之间,缺省为1。当表中的列定义为char(n)类型时,若实际要存储的串长度不足n时,则在串的尾部添加空格以达到长度n,所以char(n)的长度为n。例如某列的数据类型为char(20),而输入的字符串为”ahjm1922”,则存储的是字符ahjm1922和12个空格。若输入的字符个数超出了n,则超出的部分被截断。

l varchar[(n)]

变长字符数据类型,其中n的规定与定长字符型char中n完全相同,但这里n表示的是字符串可达到的最大长度。varchar(n)的长度为输入的字符串的实际字符个数,而不一定是n。例如,表中某列的数据类型为varchar(100),而输入的字符串为”ahjm1922”,则存储的就是字符ahjm1922,其长度为8字节。

当列中的字符数据值长度接近一致时,例如姓名,此时可使用 char;而当列中的数据值长度显著不同时,使用varchar较为恰当,可以节省存储空间。

(7) Unicode字符型

Unicode是“统一字符编码标准”,用于支持国际上非英语语种的字符数据的存储和处理。SQL Server的Unicode字符型可以存储Unicode标准字符集定义的各种字符。

Unicode字符型包括nchar[(n)]和nvarchar[(n)]两类。nchar是固定长度 Unicode 数据的数据类型,nvarchar 是可变长度 Unicode 数据的数据类型,二者均使用 UNICODE UCS-2 字符集。

l nchar[(n)]:nchar[(n)]为包含n个字符的固定长度 Unicode 字符型数据,n 的值在 1 与 4,000 之间,缺省为1。长度为2n字节。若输入的字符串长度不足n,将以空白字符补足。

l nvarchar[(n)]:nvarchar[(n)]为最多包含n个字符的可变长度 Unicode 字符型数据,n 的值在 1 与 4,000之间,缺省为1。长度是所输入字符个数的两倍。

实际上,nchar、nvarchar与char、varchar的使用非常相似,只是字符集不同(前者使用Unicode字符集,后者使用ASCII字符集)。

(8) 文本型

当需要存储大量的字符数据,如较长的备注、日志信息等等,字符型数据的最长8000个字符的限制可能使它们不能满足这种应用需求,此时可使用文本型数据。

文本型包括text和ntext两类,分别对应ASCII字符和Unicode字符。text类型可以表示最大长度为 231-1 (2,147,483,647) 个字符,其数据的存储长度为实际字符数个字节。ntext可表示最大长度为 230 - 1 (1,073,741,823) 个Unicode字符,其数据的存储长度是实际字符个数的两倍(以字节为单位)。

(9) 二进制型

二进制数据类型表示的是位数据流,包括binary(固定长度)和varbinary(可变长度)两种。

l binary [(n) ]:固定长度的n个字节二进制数据。n取值范围为 1 到 8,000,缺省为1。binary(n)数据的存储长度为 n+4 字节。若输入的数据长度小于n,则不足部分用0填充;若输入的数据长度大于n,则多余部分被截断。

输入二进制值时,在数据前面要加上0x,可以用的数字符号为0—9、A—F(字母大小写均可)。因此,二进制数据有时也被称为十六进制数据。例如0xFF、0x12A0分别表示值FF和12A0。因为每字节的数最大为FF,故在“0x”格式的数据每两位占1个字节。

l varbinary [(n) ]:n个字节变长二进制数据。n取值范围为 1 到 8,000,缺省为1。varbinary(n)数据的存储长度为实际输入数据长度+4个字节。

(10) 日期时间类型

日期时间类型数据用于存储日期和时间信息,包括datetime和smalldatetime两类。

l datetime:datetime类型可表示的日期范围从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精确度为百分之三秒(333 毫秒或 000333 秒),例如1到3毫秒的值都表示为0毫秒,4到6毫秒的值都表示为4毫秒。

datetime类型数据长度为8字节,日期和时间分别使用4个字节存储。前4 字节用于存储datetime类型数据中距1900 年 1 月 1 日的天数,为正数表示日期在1900年1月1日之后,为负数则表示日期在1900年1月1日之前。后4个字节用于存储datetime类型数据中距12:00(24小时制)的毫秒数。

用户以字符串形式输入datetime类型数据,系统也以字符串形式输出datetime类型数据,将用户输入到系统以及系统输出的datetime类型数据的字符串形式称为datetime类型数据的“外部形式”,而将datetime在系统内的存储形式称为“内部形式”,SQL Server负责datetime类型数据的两种表现形式之间的转换,包括合法性检查。

用户给出datetime类型数据值时,日期部分和时间部分分别给出。

日期部分的表示形式常用的格式如下:

年 月 日 2001 Jan 20、2001 Janary 20

年 日 月 2001 20 Jan

月 日[,]年 Jan 20 2001、Jan 20,2001、Jan 20,01

月 年 日 Jan 2001 20

日 月[,]年 20 Jan 2001、20 Jan,2001

日 年 月 20 2001 Jan

年(4位数) 2001表示2001年1月1日

年月日 20010120、010120

月/日/年 01/20/01、1/20/01、01/20/2001、1/20/2001

月-日-年 01-20-01、1-20-01、01-20-2001、1-20-2001

月日年 012001、12001、01202001、1202001

说明:年可用4位或2位表示,月和日可用1位或2位表示。

时间部分常用的表示格式如下:

时:分 10:20、08:05

时:分:秒 20:15:18、20:15:182

时:分:秒:毫秒 20:15:18:200

时:分AM|PM 10:10AM、10:10PM

l smalldatetime:smalldatetime类型数据可表示从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间,数据精确到分钟,即29998 秒或更低的值向下舍入为最接近的分钟,29999 秒或更高的值向上舍入为最接近的分钟。Smalldatetime类型数据的存储长度为4字节,前2个字节用来存储smalldatetime类型数据中日期部分距1900年1月1日之后的天数;后2个字节用来存储smalldatetime类型数据中时间部分距中午12点的分钟数。

用户输入smalldatetime类型数据的格式与datetime类型数据完全相同,只是它们的内部存储可能不相同。

(11) 时间戳型

标识符是timestamp。若创建表时定义一个列的数据类型为时间戳类型,那么每当对该表加入新行或修改已有行时,都由系统自动将一个计数器值加到该列,即将原来的时间戳值加上一个增量。记录timestamp列的值实际上反映了系统对该记录修改的相对(相对于其他记录)顺序。一个表只能有一个timestamp 列。Timestamp类型数据的值实际上是二进制格式数据,其长度为8字节。

(12) 图象数据类型

标识符是image,它用于存储、照片等。实际存储的是可变长度二进制数据,介于 0 与 231-1 (2,147,483,647) 字节之间。

(13) 其它数据类型

除了上面所介绍的常用数据类型外,SQL Server 2000还提供了其它几种数据类型:cursor、sql_variant、table和uniqueidentifier。

Cursor:是游标数据类型,用于创建游标变量或定义存储过程的输出参数。

Sql_variant:是一种存储 SQL Server 支持的各种数据类型(除text、ntext、image、timestamp 和 sql_variant 外)值的数据类型。Sql_variant的最大长度可达 8016 字节。

Table:是用于存储结果集的数据类型,结果集可以供后续处理。

Uniqueidentifier:是唯一标识符类型。系统将为这种类型的数据产生唯一标识值,它是一个16字节长的二进制数据。

类型名称

Oracle

SQLServer

比较

字符数据类型

CHAR

CHAR

都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb

变长字符数据类型

VARCHAR2

VARCHAR

Oracle里面最大长度为4kb,SQLServer里面最大长度为8kb

根据字符集而定的固定长度字符串

NCHAR

NCHAR

前者最大长度2kb后者最大长度4kb

根据字符集而定的可变长度字符串

NVARCHAR2

NVARCHAR

二者最大长度都为4kb

日期和时间数据类型

DATE

有Datetime和Smalldatetime两种

在oracle里面格式为DMY在SQLSerser里面可以调节,默认的为MDY

数字类型

NUMBER(P,S)

NUMERIC[P(,S)]

Oracle里面p代表小数点左面的位数,s代表小数点右面的位数。而SQLServer里面p代表小数点左右两面的位数之和,s代表小数点右面的位数。

数字类型

DECIMAL(P,S)

DECIMAL[P(,S)]

Oracle里面p代表小数点左面的位数,s代表小数点右面的位数。而SQLServer里面p代表小数点左右两面的位数之和,s代表小数点右面的位数。

整数类型

INTEGER

INT

同为整数类型,存储大小都为4个字节

浮点数类型

FLOAT

FLOAT

实数类型

REAL

REAL

以上就是关于mysql 数据类型的详解全部的内容,包括:mysql 数据类型的详解、mysql资料库里的日期用timestamp还是datetime好、数据库有时间长度类型吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10220020.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存