关于mysql的数据类型的整理

来源:互联网 发布:淘宝考试助手 编辑:程序博客网 时间:2024/06/05 16:29

数据类型: 占byte的数量长度的作用比如tinyint(4) 无符号范围  有符号范围

tinyint 1byte不对范围起作用 0~255-128~127

smallint 2byte 不对范围起作用 0~65535-32768~32767

MEDIUMINT  3byte 不对范围起作用 0到16777215 -8388608到8388607

int 4byte 不对范围起作用 0到4294967295 -2147493648到2147493647

BIGINT 8byte 不对范围起作用 0到18446744073709551615 -9223372036854775808到9223372036854775807

FLOAT——一个小的菜单精度浮点数。支持 -3.402823466E+38到-1.175494351E-38,0和1.175494351E-38 to 3.402823466E+38,需要4个字节存储。如果是UNSIGNED,正数的范围保持不变,但负数是不允许的。


DOUBLE——一个双精度浮点数。支持 -1.7976931348623157E+308到-2.2250738585072014E-308,0和2.2250738585072014E-308到1.7976931348623157E+308。如果是FLOAT,UNSIGNED不会改变正数范围,但负数是不允许的。


CHAR——字符。固定长度的字串,在右边补齐空格,达到指定的长度。支持从0到155个字符。搜索值时,后缀的空格将被删除。


VARCHAR——可变长的字符。一个可变长度的字串,其中的后缀空格在存储值时被删除。支持从0到255字符


TEXT——支持65535个字符。要求长度+2字节的存储。 (64KB)


DATETIME——格式:'YYYY-MM-DD HH:MM:SS',范围:'1000-01-01 00:00:00'到'9999-12-31 23:59:59'


DATE——格式:'YYYY-MM-DD',范围:'1000-01-01'到'9999-12-31'


TIMESTAMP——格式:'YYYYMMDDHHMMSS'、'YYMMDDHHMMSS'、'YYYYMMDD'、'YYMMDD',范围:'1970-01-01 00:00:00'到'2037-01-01 00:00:00'


TIME——格式:'HH:MM:SS'


YEAR——格式:'YYYY,范围:'1901'到'2155'


“decimal   类型是适合财务和货币计算的   128   位数据类型。”

浮点数的精度损失可能在很多地方出现,例如d   *   g   /   g   不一定等于d,d   /   g   *   g也不一定等于d。   

    

  还有两个非常危险的错误认识!!  

   

  1、decimal不是浮点型、decimal不存在精度损失。

  下面有段程序大家可以去看看结果是什么。记住!所有的浮点型变量都存在精度损失的问题,而decimal是一个不折不扣的浮点型,不论它精度有多高,精度损失依然存在!  

   

                  decimal   dd   =   10000000000000000000000000000m;  

                  dd   +=   0.1m;  

                  Console.WriteLine   (   "{0:G50}",   dd   );   

    

  2、decimal所能储存的数比double大,从double到decimal的类型转换不会出现任何问题。

  微软在decimal的帮助上真的要好好反省了。实际上只有从整形到decimal的转换才是扩大转换,decimal的精度比double大,但所能储存的最大数却比double要小。

 




数据类型大小M
(默认值)
范围(有符号)范围(无符号)用途tinyint [(M)] [UNSIGNED] [ZEROFILL]1字节4-128~127  (-27~27-1)0 ~ 255 (0 ~ 28-1)非常小整数值smallint [(M)] [UNSIGNED] [ZEROFILL]2字节6-32768~32767(-215 ~ 215-1)0 ~ 65535 (0 ~ 216-1) 较小整数mediumint [(M)] [UNSIGNED] [ZEROFILL]3字节9-8388608 ~ 8388607 (-223 ~ 223-1)0 ~ 16777215 (0 ~ 224-1) 中等大小整数int [(M)] [UNSIGNED] [ZEROFILL]4字节 11-2147483648 ~ 2147483647(-231 ~ 231-1)0 ~ 4294967295 (0 ~ 232-1) 标准整数integer [(M)] [UNSIGNED] [ZEROFILL]4字节 11-2147483648 ~ 2147483647(-231 ~ 231-1)0 ~ 4294967295 (0 ~ 232-1)和int相同bigint [(M)] [UNSIGNED] [ZEROFILL]8字节20-9223372036854775808 ~9223372036854775807
(-263 ~ 263-1)0 ~ 18446744073709551615
(0 ~ 264-1) 较大整数


数据类型大小用途float [(M,D)] [ZEROFILL]4字节单精度浮点型,8位精度;参数m只影响显示效果,不影响精度,d却不同,会影响到精度;m是十进制数字的总个数,d是小数点后面的数字个数double[(M,D)] [ZEROFILL]8字节双精度浮点型,16位精度;参数m只影响显示效果,不影响精度,d却不同,会影响到精度real[(M,D)] [ZEROFILL]8字节 同doubledecimal[(M[,D])] [ZEROFILL]4字节  decimal(m,d) 定点类型浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。参数m是定点类型数字的最大个数(精 度),范围为0~65,d小数点右侧数字的个数,范围为0~30,但不得超过m。对定点数的计算能精确到65位数字。DECIMAL 数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句 DECIMAL(7,3) 规定了存储的值不会超过 7 位数字,并且小数点后不超过 3 位numeric[(M,D)]  [ZEROFILL]4字节 同decimal


数据类型大小(范围)用途char(M)[BINARY]

M个字节,0 <= M <= 255 (L为固定的=255,不够补空格)

定长字符串;CHAR 类型可以使用 BINARY 修饰符。当用于比较运算时,这个修饰符使 CHAR 以二进制方式参于运算,而不是以传统的区分大小写的方式。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词varchar(M) [BINARY]

L+1个字节,其中L <= 0 <= M <= 65535(MySQL5.0之前都是最大255)

变长字符串;VARCHAR 类型在使用 BINARY 修饰符时与 CHAR 类型完全相同tinyblobtinytext

L+1个字节,其中L < 28-1 (255)

tinyblob:不超过 255 个字符的二进制字符串;tinytext:短文本字符串blob,text

L+2个字节,其中L < 216-1 (65535)

blob:二进制形式的长文本数据,在分类和比较时BLOB 类型区分大小写;text:长文本数据,在分类和比较时TEXT 不区分大小写mediumblob,mediumtext

L+3个字节,其中L < 224-1

mediumblob:二进制形式的中等长度文本数据;mediumtext :中等长度文本数据,longblob,longtext

L+4个字节,其中L < 232-1

longblob:二进制形式的极大文本数据   ;longtext :极大文本数据enum('value1','value2',...)

12个字节,取决于枚举值的个数(最多65,535个值)

 set('value1','value2',...)

1234或者8个字节,取决于set成员的数目(最多64个成员)

 

这里要说一点:varchar后面跟的长度表示的是保存字符的长度,保存的数据不能超过这个长度,比如varchar(4)存储的数据就不能超过4个字符。


类型大小 范围格式用途YEAR[(2|4)]1字节1901/2155YYYY年份值DATE 3字节'1000-01-01'--'9999-12-31'YYYY-MM-DD 日期值TIME3字节'-838:59:59'到'838:59:59'HH:MM:SS 时间值或持续时间DATETIME8字节 '1000-01-01 00:00:00'--'9999-12-31 23:59:59'YYYY-MM-DD HH:MM:SS 混合日期和时间值TIMESTAMP[(M)]8字节  1970-01-01 00:00:00/2037 年某时YYYYMMDD HHMMSS 混合日期和时间值,时间戳

 (1)YEAR

   给YEAR类型赋值可以有三种方法。

   第一种是直接插入4位字符串或者4位数字。

   第二种是插入2位字符串,这种情况下如果插入‘00’~‘69’,则相当于插入2000~2069;如果插入‘70’~‘99’,则相当于插入1970~1999。第二种情况下插入的如果是‘0’,则与插入‘00’效果相同,都是表示2000年。

    第三种是插入2位数字,它与第二种(插入两位字符串)不同之处仅在于:如果插入的是一位数字0,则表示的是0000,而不是2000年。所以在给YEAR类型赋值时,一定要分清0和‘0’,虽然两者相差个引号,但实际效果确实相差了2000年。

(2)DATE

   MySQL是以YYYY-MM-DD格式来显示DATE类型的值,插入数据时,数据可以保持这种格式。另外,MySQL还支持一些不严格的语法格式,分隔符“-”可以用“@”、“.”等众多富豪来替代。在插入数据时,也可以使用“YY-MM-DD”格式,YY转化成对应的年份的规则与YEAR类型类似。如果我们想插入当前系统的时间,则可以插入CURRENT_DATE或者NOW()。
   允许使用字符串或数字把值赋给DATE列。

(3)TIME

    TIME类型表示为“时:分:秒”,尽管小时范围一般是0~23,但是为了表示某些特殊时间间隔,MySQL将TIME的小时范围扩发了,而且支持负值。对TIME类型赋值,标准格式是"HH:MM:SS",但不一定非要是这种格式。如果插入的是"D HH:MM:SS"格式,则类似插入了"(D*24+HH):MM:SS"。比如插入"2 23:50:50",相当于插入了"71:50:50"。如果插入的是"HH:MM"或"SS"格式,则效果是其他未被表示位的值赋为零值。比如插入"30",相当于插入了"00:00:30";如果插入"11:25",相当于插入了"11:25:00"。
    另外也可以插入‘D HH’和‘D HH:MM’,效果按上面的例子可以推理出来了吧。 在MySQl中,对于'HHMMSS'格式,系统能够自动转化为标准格式。如果我们想插入当前系统的时间,则可以插入CURRENT_TIME或者NOW()。    
    TIME类型允许使用字符串或数字把值赋给TIME列,只占3个字节,如果只是存储时间数据,它最合适了。
    需要注意的是,没有冒号分隔符的 TIME 类型值,将会被 MySQL 理解为持续的时间,而不是时间戳。

(4)DATETIME

    通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。

(5)TIMESTAMP

    通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。  
    TIMESTAMP的取值范围比较小,没有DATETIME的取值范围大,因此输入值时一定要保证在TIMESTAMP的范围之内。它的插入也与插入其他日期和时间数据类型类似。
    那么TIMESTAMP类型如何插入当前时间?第一,可以使用CURRENT_TIMESTAMP;第二,输入NULL,系统自动输入当前的TIMESTAMP;第三,无任何输入,系统自动输入当前的TIMESTAMP。
    另外有很特殊的一点:TIMESTAMP的数值是与时区相关.
    MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式来显示TIMESTAMP值,取决于是否M是14(或省略)、12、8或6,但是允许你使用字符串或数字把值赋给TIMESTAMP列。一个TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,因为如果你不自己给它赋值,它自动地被设置为最近操作的日期和时间。你以可以通过赋给它一个NULL值设置它为当前的日期和时间



当需要存储二进制数据的时候,用到数据类型binary或者varbinary



布尔类型 bool或者boolean在mysql数据库会默认转换为tinyint(1)


还有一个类型bit,这个东西基本不用



原创粉丝点击