Chinaunix首页 | 论坛 | 博客
  • 博客访问: 423396
  • 博文数量: 62
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 740
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-10 21:59
个人简介

付出,终有回报!

文章分类

全部博文(62)

文章存档

2018年(6)

2017年(24)

2016年(6)

2015年(26)

分类: Mysql/postgreSQL

2017-03-16 10:22:00

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

1)数值数据类型:包括严格数值数据类型(INTEGERSMALLINTDECIMALNUMERIC),以及近似数值数据类型(FLOATREALDOUBLE PRECISION)

2)时间/日期类型:包括DATETIME、DATETIMESTAMPTIMEYEAR等。

3)字符串类型:包括CHAR、VARCHARBINARYVARBINARYBLOBTEXTENUMSET等。


一、整数类型




不同类型整数存储所需的字节数是不同的,相应的占用字节越多的类型所能表示的数值范围越大。根据占用字节数可以求出每一种数据类型的取值范围,例如tinyint需要1个字节〔8 bits )来存储,那么tinyint无符号数的最大值为28-1 ,即255

注意:创建表时设置,如year int(4),表示的是数据类型指定的显示宽度,指定能够显示的数值中数字的个数。但显示宽度与数据类型的取值范围是无关的。显示宽度只是指明最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。例如,假如向year段插入一个数值19990,当时用select查询该列值的时候,MySQL显示的将是完整的 5位数字的19999,而不是4位数字的值。


二、定点数类型和浮点数类型


MySQL中使用浮点数和定点数来表示小数。

 

MySQL数据类型

含义

float(m, d)

4字节,单精度浮点型,m总个数,d小数位

double(m, d)

8字节,双精度浮点型,m总个数,d小数位

decimal(m, d)

decimal是存储为字符串的浮点数



1、定点数


DECIMALNUMERIC类型在MySQL中视为相同的类型,定点数类型。它们用于保存必须为确切精度的值。

使用方式如下:

Salary decimal(5,2)

下面的介绍将基于上面这个例子。

    我们看到其中有两个参数,即DECIMAL(M,D),其中M表示十进制数字总的个数,D表示小数点后面数字的位数,上例中的取值范围为-999.99~999.99

    如果存储时,整数部分超出了范围(如上面的例子中,添加数值为1000.01),MySql就会报错,不允许存这样的值。

    如果存储时,小数点部分若超出范围,就分以下情况:

    (1)若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。如999.994实际被保存为999.99

    (2)若四舍五入后,整数部分超出范围,则MySql报错,并拒绝处理。如999.995-999.995都会报错。

    M的默认取值为10D默认取值为0。如果创建表时,某字段定义为decimal类型不带任何参数,等同于decimal(10,0)带一个参数时,D取默认值。

    M的取值范围为1~65,取0时会被设为默认值,超出范围会报错。

    D的取值范围为0~30,而且必须<=M,超出范围会报错。

所以,很显然,当M=65D=0时,可以取得最大和最小值。


2、浮点数


浮点数是用来表示实数的一种方法,它用 M(尾数) * B( 基数)E(指数)次方来表示实数。浮点数相对于定点数的优点是,在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是引起精度问题。

浮点类型有:单精度浮点类型-float,双精度浮点类型-doublereal。他们定义方式为:FLOAT(M,D) REAL(M,D) DOUBLE PRECISION(M,D)

(M,D)”表示该值一共显示M位整数,其中D为位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001

FLOAT和DOUBLE中的MD的取值默认都为0,即除了最大最小值,不限制位数。允许的值理论上是-1.7976931348623157E+308~-2.2250738585072014E-30802.2250738585072014E-308~1.7976931348623157E+308


三、日期与时间类型


MySQL 带有 5 个不同的数据类型可供选择:datetimedatetimestamptimeyear




1、year


year类型是一个单字节类型用于表示年,在存储时只需要l个字节。可以使用各种格式指定year的值,如下所示:

1) 以4位字符串或者4位数字格式表示的YEAR,范围为‘1901’一‘2155'。输入格式为‘YYYY’或者YYYY,例如,输入‘2010'2010.插入到数据库的值均为2010

2)以2位字符串格式表示的YEAR,范围为‘00'到‘99’。‘00’一‘69’和‘70’一‘99’范围的值分别被转换为2000-20691970-1999范围的YEAR值。‘0’与‘00’的作用相同。插入超过取值范困的值将被转换为2000

3)以2位数字表示的YEAR,范围为1-991-6970-99范围的值分别被转换为2001-20691970-1999范围的YEAR值。注意:0将被转换为0000,而不是20000

例:mysql> insert into dt (yr) values ('0'),('00'),('77'),('10'),(0),(78),(11);




2、time


Time类型用在只需要时间信息的值,在存储时而要3个字节。格式为‘HHMMSS’。HH表示小时,  MM表示分钟,SS表示秒。time类型的取值范围围-838:59:59 ---838:59:59,小时部分会如此人的原因是time类型不仅可以不仅可以表示一天的时间〔必须小1- 24小时),还可能是某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)。


3、datetime


Datetime类型用在需要同时包含日期和时间信息的值,在存储时需要8个字节。日期格式为`YYYY-MM-DD HH:MM:SS',给datetime类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合datetime的日期格式即可。


4、timestamp


Timestamp的显示格式与datetime相同,显示宽度固定在19个字符。日期格式为‘YYYY-MM-DD HH:MM:SS’,在存储时需要4个字节。但是timestamp列的取值范围小于datetime,为‘1970-01-01 00:00:01UTC--- ‘2038-01-19 03:14:07’UTC,其中UTC为世界标准时间,因此在插入数据时,要保证在合法的取值范围内。


四、字符串类型


字符串类型指CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET

VARCHAR、BLOBTEXT类型是变长类型,对于其存储需求取决于列值的实际长度,而不是取决于类型的最大可能尺寸。例如,一个VARCHAR[10]列能保存最大长度为10个字符的一个字符串。实际的存储需要是字符串的长度L,加1个字节以记录字符串的长度。对于字符"abcd" L4 而存储要求是5个宇节。


1、charvarchar类型


CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。默认长度都为255

    CHAR列的长度固定为创建表时声明的长度。长度可以为从0255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉,所以,我们在存储时字符串右边不能有空格,即使有,查询出来后也会被删除。在存储或检索过程中不进行大小写转换。

    VARCHAR列中的值为可变长字符串。长度可以指定为065,535之间的值。

下面显示了将各种字符串值保存到CHAR(4)VARCHAR(4)列后的结果:


表中最后一行的值只适用在不使用严格模式时;如果MySQL运行使用严格模式,超过列长度的值不保存,并且会出现错误。

 因为空格的原因,相同的值存入到长度都足够的varvharchar中,取出可能会不同,比如"a""a  "


2、textblob类型


BLOB是一个二进制大对象,可以容纳可变数量的数据。有4BLOB类型:TINYBLOBBLOBMEDIUMBLOBLONGBLOB。它们只是可容纳值的最大长度不同。

4TEXT类型:TINYTEXTTEXTMEDIUMTEXTLONGTEXT。这些对应4BLOB类型,有相同的最大长度和存储需求。

BLOB列被视为二进制字符串。TEXT列被视为字符字符串,类似CHARBINARY

TEXTBLOB列的存储或检索过程中,不存在大小写转换。

它们(TEXTBLOB同)的长度:

l  Tiny:最大长度255个字符(2^8-1)

l  BLOB或TEXT:最大长度65535个字符(2^16-1)

l  Medium:最大长度16777215个字符(2^24-1)

l  LongText 最大长度4294967295个字符(2^32-1)


3、enum类型


MySql中的ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。

可以插入空字符串""NULL

enum类型的字段在取值时 ,只能在指定的枚举列表中取,而且一次只能取一个。如果创建的成员中有空格时,其尾部的空格将自动被删除。Enum值在内部用整数表示,每个枚举值均有一个索引值:列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。枚举最多可以有65535个元素。



4、set类型


SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(,)间隔开。

ENUM类型相同,set在内部用整数表示,列表中每一个值都有一个索引编号。当创建表时,set成员值尾部的空格将自动被删除。但与enum不同的是,ENUM类型的字段只能从定义的列值中选择一个值插入,而set类型的列可从定义的列值中选择多个字符的联合。

如果插入SET字段中列值有重复,则MySQL自动删除重复的值;插入set字段的值的顺序并不重要,MySQL会在存入数据库时,按照定义的顺序显示;如果插入了不正确的值,默认情况,MySQL将忽视这些值,并给出警告。


五、如何选择数据类型


简单的原则:

A、通常最小的是最好的

     因为这样可以用更少的磁盘、内容、CPU缓存,大大减少IO开销。

B、简单就好

     简单的数据类型操作通常需要更少的CPU周期。例如,整型比字符操作代价更小,因为字符集和校对规则(排序规则)使它比整型更复杂。比如应该使用MySQL内建的类型而不是使用字符型来存储日期和时间。

C、尽量避免使用NULL

     NULL是列默认的属性,通常我们要指定为NOT NULL。有NULL的列值会使得索引、索引统计和值比较更加复杂。可为NULL的列会使用更多的存储空间,在MySQL中也需要对它进行特殊处理,当可为NULL列做索引时,每个索引需要一个额外的字节,在MyISAM更有可能导致固定大小的索引变成可变大小索引,在InnoDB中使用单独的位(bit)存储NULL值。


1、charvarchar之间的特点与选择


CHAR类型的长度是固定的,而VARCHAR类型的长度是在范围内可变的。因此,VARCHAR类型占用的空间比CHAR类型小。而且,VARCHAR类型比CHAR类型灵活。对于长度变化比较大的字符串类型,最好选择VARCHAR类型。

虽然,CHAR类型的占用空间比较大,但是CHAR类型的处理速度比VARCHAR快。因此,对于长度变化不大和查询速度要求较高的字符串类型,最好选择CHAR类型。

存储引擎对于选择CHARVARCHAR的影响:

    对于MyISAM存储引擎:最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。

    对InnoDB存储引擎:使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用CHAR不一定比使用VARCHAR更好,单由于VARCHAR是按照实际的长度存储,比较节省空间,所以对磁盘1IO和数据存储总量比较好。


2、blobtext


blob是二进制字符串,text是非二进制字符串。Blob主要存储图片、音频信息等,text只能存储纯文本文件。

blob和text执行大量删除操作时,会产生数据“空洞”,即删除记录前后数据库所占内存,没有发生变化。需要对表进行optimize(优化)操作,“空洞”空间才可以被回收。


3、浮点数和定点数


1.浮点数存在误差问题。

2.对货币等对精度敏感的数据,应该用定点数表示或存储。

3.在编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较。

4.要注意一些特殊值的处理。

 

参考:http://blog.csdn.net/anxpp/article/details/51284106


阅读(1516) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~