MySQL中数据类型介绍

发布时间:2019-10-12  栏目:SQL  评论:0 Comments

一、MySQL的数据类型

驷不比舌不外乎以下五大类:

大背头连串:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT

浮点数类型:FLOAT、DOUBLE、DE奥迪A8L

字符串类型:CHACRUISER、VARCHA福特Explorer、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY
BLOB、BLOB、MEDIUM BLOB、LONG BLOB

日期类型:Date、DateTime、TimeStamp、提姆e、Year

别的数据类型:BINA奥迪Q3Y、VARBINA奥德赛Y、ENUM、SET、吉优metry、Point、MultiPoint、LineString、MultiLineString、Polygon、吉优metryCollection等

 

1、整型

MySQL数据类型 含义(有符号)
tinyint(m) 1个字节  范围(-128~127)
smallint(m) 2个字节  范围(-32768~32767)
mediumint(m) 3个字节  范围(-8388608~8388607)
int(m) 4个字节  范围(-2147483648~2147483647)
bigint(m) 8个字节  范围(+-9.22*10的18次方)

取值范围假若加了unsigned,则最大值翻倍,如tinyint
unsigned的取值范围为(0~256)。

 int(m)里的m是表示SELECT查询结果集中的显示升幅,并不影响其实的取值范围,未有影响到显示的肥瘦,不精晓那一个m有啥用。

 

2、浮点型(float和double)

MySQL数据类型 含义
float(m,d) 单精度浮点型    8位精度(4字节)     m总个数,d小数位
double(m,d) 双精度浮点型    16位精度(8字节)    m总个数,d小数位

设两个字段定义为float(6,3),借使插入一个数123.45678,实际数据Curry存的是123.457,但总个数还以实际为准,即6位。整数有的最大是3位,假若插入数12.123456,存款和储蓄的是12.1234,若是插入12.12,存款和储蓄的是12.1200.

 

3、定点数

浮点型在数据库中寄放的是相仿值,而固定类型在数据库中贮存的是正确值。 

decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。

 

4、字符串(char,varchar,_text)

MySQL数据类型 含义
char(n) 固定长度,最多255个字符
varchar(n) 固定长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符

char和varchar:

1.char(n)
若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾无法有空格,varchar不限于此。 

2.char(n)
稳固长度,char(4)不管是存入多少个字符,都将占有4个字节,varchar是存入的实在字符数+1个字节(n<=255)或2个字节(n>255),

就此varchar(4),存入3个字符将占用4个字节。 

3.char类型的字符串检索速度要比varchar类型的快。
varchar和text: 

1.varchar可钦点n,text不能够钦赐,内部存款和储蓄varchar是存入的骨子里字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字

节。 

2.text类型无法有暗许值。 

3.varchar可一向开立索引,text创造索引要钦赐前有个别个字符。varchar查询速度快于text,在都成立索引的意况下,text的目录就像是不起功效。

 

5.二进制数据(_Blob)

1._BLOB和_text存款和储蓄格局各异,_TEXT以文件格局存款和储蓄,瑞典语存款和储蓄区分轻重缓急写,而_Blob是以二进制格局存款和储蓄,不分大小写。

2._BLOB存款和储蓄的数额只好完全读出。 

3._TEXT能够钦定字符集,_BLO不用钦赐字符集。

 

6.日未时间档案的次序

MySQL数据类型 含义
date 日期 ‘2008-12-2’
time 时间 ’12:25:36′
datetime 日期时间 ‘2008-12-2 22:06:44’
timestamp 自动存储记录修改时间

若定义八个字段为timestamp,那几个字段里的时光数额会随别的字段修改的时候自动刷新,所以这么些数据类型的字段能够贮存那条记下最终被修改的岁月。

 

数据类型的天性

 

MySQL关键字 含义
NULL 数据列可包含NULL值
NOT NULL 数据列不允许包含NULL值
DEFAULT 默认值
PRIMARY KEY 主键
AUTO_INCREMENT 自动递增,适用于整数类型
UNSIGNED 无符号
CHARACTER SET name 指定一个字符集

 

标签: mysql数据类型mysql全体数据类型mysql字段类型mysql数据存款和储蓄mysql

图片 1 分类:

服务器及软件———MySQL数据库(4) 图片 2

目录(?)[+]

 

   
据笔者总结,MySQL援助39种(按可利用的品类字段总括,即同义词也作八个)数据类型。下边包车型的士牵线恐怕在至极古老的MySQL本子中不适用。

   
转载请申明出处:http://blog.csdn.net/anxpp/article/details/51284106。谢谢!

    文本首要参照了合法语档:http://dev.mysql.com/doc/refman/5.7/en/

二、MYSQL数据类型的尺寸和限量

各数据类型及字节长度一览表:

数据类型 字节长度 范围或用法
Bit 1 无符号[0,255],有符号[-128,127],天缘博客备注:BIT和BOOL布尔型都占用1字节
TinyInt 1 整数[0,255]
SmallInt 2 无符号[0,65535],有符号[-32768,32767]
MediumInt 3 无符号[0,2^24-1],有符号[-2^23,2^23-1]]
Int 4 无符号[0,2^32-1],有符号[-2^31,2^31-1]
BigInt 8 无符号[0,2^64-1],有符号[-2^63 ,2^63 -1]
Float(M,D) 4 单精度浮点数。天缘博客提醒这里的D是精度,如果D<=24则为默认的FLOAT,如果D>24则会自动被转换为DOUBLE型。
Double(M,D) 8  双精度浮点。
Decimal(M,D) M+1或M+2 未打包的浮点数,用法类似于FLOAT和DOUBLE,天缘博客提醒您如果在ASP中使用到Decimal数据类型,直接从数据库读出来的Decimal可能需要先转换成Float或Double类型后再进行运算。
Date 3 以YYYY-MM-DD的格式显示,比如:2009-07-19
Date Time 8 以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30
TimeStamp 4 以YYYY-MM-DD的格式显示,比如:2009-07-19
Time 3 以HH:MM:SS的格式显示。比如:11:22:30
Year 1 以YYYY的格式显示。比如:2009
Char(M) M
定长字符串。
VarChar(M) M 变长字符串,要求M<=255
Binary(M) M 类似Char的二进制存储,特点是插入定长不足补0
VarBinary(M) M 类似VarChar的变长二进制存储,特点是定长不补0
Tiny Text Max:255 大小写不敏感
Text Max:64K 大小写不敏感
Medium Text Max:16M 大小写不敏感
Long Text Max:4G 大小写不敏感
TinyBlob Max:255 大小写敏感
Blob Max:64K 大小写敏感
MediumBlob Max:16M 大小写敏感
LongBlob Max:4G 大小写敏感
Enum 1或2 最大可达65535个不同的枚举值
Set 可达8 最大可达64个不同的值
Geometry    
Point    
LineString    
Polygon    
MultiPoint    
MultiLineString    
MultiPolygon    
GeometryCollection    

1、概述

   
要领会八个数据库,大家也无法不询问其帮忙的数据类型。

 
  mysql支撑具有正式的SQL数据类型,主要分3类:

  •     数值类型
  •     字符串类型
  •     时间日期类型

    另一类是几何数据类型,用的非常少,也没多介绍。   
上面大、小标题后括号内的数组表示其蕴藉的品种个数。下边全数结论都由此自家使用MySql
Workbench编写SQL验证过或出自官方网站。

 

三、使用提议

1、在钦赐数据类型的时候日常是利用从小原则,比方能用TINY
INT的最棒就绝不INT,能用FLOAT类型的就不要DOUBLE类型,那样会对MYSQL在运作效用上加强十分大,尤其是运气据量测量检验条件下。

2、无需把数据表设计的太过复杂,功能模块上分别可能对于中期的维护更为有利,严谨出现杂炖数据表

3、数据表和字段的起名字也是一门学问

4、设计数据表结构此前请先想象一下是您的屋企,只怕结果会越加合理、高效

5、数据库的最后设计结果断定是功能和可增加性的折中,偏侧任何一方都以不妥的

 

2、数值类型(12)

分选数据类型的中坚尺度

前提:使用相符储存引擎。

分选标准:依据选定的囤积引擎,鲜明怎么样选取符合的数据类型。

上边包车型客车选拔情势按存款和储蓄引擎分类:

  • MyISAM
    数据存款和储蓄引擎和数据列:MyISAM数据表,最佳使用一定长度(CHA途乐)的多寡列代替可变长度(VARCHARAV4)的数据列。
  • MEMO兰德揽胜Y存款和储蓄引擎和数据列:MEMO奥迪Q5Y数据表方今都采用一定长度的数额行存款和储蓄,由此不论使用CHAQX56或VARCHAMurano列都未曾关系。两个都以作为CHAPRADO类型管理的。
  • InnoDB 存款和储蓄引擎和数据列:提出利用 VARCHA奥迪Q5类型。

对此InnoDB数据表,内部的行存款和储蓄格式未有区分固定长度和可变长度列(全体数据行都使用指向数据列值的头指针),因而在真相上,使用固定长度的CHAEnclave列不必然比选取可变长度VARCHAOdyssey列轻易。因而,首要的天性因素是数据行使用的积存总数。由于CHALX570平均占用的长空多于VARCHAPRADO,因此使用VARCHA本田CR-V来最小化供给管理的数据行的积攒总数和磁盘I/O是相比好的。

上面说一下一定长度数据列与可变长度的数据列。

    2.1、整数类型(6)

    一张图就能够说西汉楚了:

    图片 3

    INTEGER同INT。

0-255指的是十进制数
因为一字节是多少人 即能寄存00000000-11111111
二进制数11111111=256(D)

char与varchar

CHALX570和VARCHA奥迪Q5类型类似,但它们保存和寻找的格局分化。它们的最大尺寸和是否后面部分空格被封存等方面也差异。在积存或研究进程中不开展高低写转换。

上面包车型大巴表展现了将各个字符串值保存到CHACRUISER(4)和VARCHA昂Cora(4)列后的结果,表明了CHA奥德赛和VARCHAPAJERO之间的异样:

CHAR(4) 存储需求 VARCHAR(4) 存储需求
‘    ‘ 4个字节 1个字节
‘ab’ ‘ab  ‘ 4个字节 ‘ab ‘ 3个字节
‘abcd’ ‘abcd’ 4个字节 ‘abcd’ 5个字节
‘abcdefgh’ ‘abcd’ 4个字节 ‘abcd’ 5个字节

请在意上表中最后一行的值只适用不选用严刻格局时;如若MySQL运转在严苛方式,超过列长度不的值保存**,并且会产出谬误。

从CHACRUISER(4)和VARCHA奥迪Q7(4)列车检查索的值并不总是同样,因为检索时从CHAWrangler列删除了尾巴部分的空格。通过上面包车型地铁事例表明该出入:
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)
 
mysql> INSERT INTO vc VALUES (‘ab  ‘, ‘ab  ‘);
Query OK, 1 row affected (0.00 sec)
 
mysql> SELECT CONCAT(v, ‘+’), CONCAT(c, ‘+’) FROM vc;
+—————-+—————-+
| CONCAT(v, ‘+’) | CONCAT(c, ‘+’) |
+—————-+—————-+
| ab  +          | ab+            |
+—————-+—————-+
1 row in set (0.00 sec)

    2.2、定点数(2)

   
DECamaroL和NUME宝马7系IC类型在MySQL中身为等同的花色。它们用于保存必得为适龄精度的值。

    使用形式如下:

  1. salary DECIMAL(5,2)

    上边包车型客车牵线将借助上面那一个事例。

   
大家看看里面有三个参数,即DE赛欧L(M,D),此中M表示十进制数字总的个数,D表示小数点前边数字的位数,上例中的取值范围为-999.99~999.99。

   
若是存款和储蓄时,整数某个过量了限定(如下边的例子中,增多数值为1000.01),MySql就能够报错,不允许存这么的值。

    即便存款和储蓄时,小数点有的若超过范围,就分以下情状:

  •    
    若四舍五入后,整数部分没有超过范围,则只警报,但能不负职务操作并四舍五入删除多余的小数位后保存。如999.994其实被保留为999.99。
  •    
    若四舍五入后,整数片段超过范围,则MySql报错,并驳回管理。如999.995和-999.995都会报错。

   
M的暗中同意取值为10,D默许取值为0。即便成立表时,某字段定义为decimal类型不带任何参数,等同于decimal(10,0)。带七个参数时,D取暗中认可值。

  •     M的取值范围为1~65,取0时会被设为私下认可值,超出范围会报错。
  •     D的取值范围为0~30,并且必须<=M,超过范围会报错。

    所以,很醒目,当M=65,D=0时,能够博得最大和纤维值。

    已经表明很详细了,如还不精通,请过来。

text和blob

 

在利用text和blob字段类型时要静心以下几点,以便更好的表达数据库的性质。

①BLOB和TEXT值也会引起本人的有个别标题,非常是施行了大气的删减或更新操作的时候。删除这种值会在数据表中留下比不小的”空洞”,以往填入那一个”空洞”的笔录大概长度差异,为了升高质量,提出定期采用OPTIMIZE TABLE 功能对那类表张开零散整理.

②运用合成的(synthetic)索引。合成的索引列在好何时候是有效的。一种艺术是依靠此外的列的剧情创立一个散列值,并把这几个值存款和储蓄在单身的数据列中。接下来您就足以经过搜索散列值找到数据行了。可是,大家要留神这种技艺只可以用来标准相称的查询(散列值对于相近<或>=等范围搜索操作符
是未曾用处的)。大家能够利用MD5()函数生成散列值,也能够采纳SHA1()或CRC32(),可能选拔本人的应用程序逻辑来计量散列值。请牢记数值型散列值能够相当高成效地囤积。同样,要是散列算法生成的字符串带有尾巴部分空格,就无须把它们存款和储蓄在CHAXC60或VARCHA景逸SUV列中,它们会碰到尾巴部分空格去除的影响。

合成的散列索引对于那多少个BLOB或TEXT数据列极其有用。用散列标记符值查找的快慢比寻找BLOB列自己的快慢快非常多。

③在不供给的时候防止予检查索大型的BLOB或TEXT值。例如,SELECT
*查询就不是很好的主见,除非您可以看到鲜明作为约束原则的WHERE子句只会找到所须要的数据行。不然,你也许毫无指标地在网络上传输大批量的值。那也是
BLOB或TEXT标记符消息存款和储蓄在合成的索引列中对我们具备助于的例证。你能够搜索索引列,决定这几个急需的数码行,然后从合格的数额行中检索BLOB或
TEXT值。

④把BLOB或TEXT列分离到独门的表中。在好几际遇中,如若把那么些多少列移动到第二张数据表中,能够令你把原数据表中
的数据列转变为定点长度的数量行格式,那么它正是有意义的。那会缩减主表中的碎片,使您得到稳固长度数据行的习性优势。它还令你在主数据表上运营SELECT *查询的时候不会通过网络传输大批量的BLOB或TEXT值。

    2.3、浮点数(3)

    浮点数是用来表示实数的一种办法,它用 M(尾数) * B(
基数)的E(指数)次方来代表实数,绝对于定点数来说,在长短一定的动静下,具备象征数据范围大的风味。但与此同时也存在固有误差难点。

    假若期望保证值比较确切,推荐使用定点数数据类型。

    MySql中的浮点类型有float,double和real。他们定义情势为:FLOAT(M,D)
、 REAL(M,D) 、 DOUBLE PRECISION(M,D)。

 
  REAL正是DOUBLE ,如若SQL服务器形式包罗REAL_AS_FLOAT选项,REAL是FLOAT的同义词实际不是DOUBLE的同义词。

   
“(M,D)”表示该值一共呈现M位整数,个中D位位于小数点后边。比方,定义为FLOAT(7,4)的三个列能够彰显为-999.9999。MySQL保存值时开展四舍五入,由此只要在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。

   
FLOAT和DOUBLE中的M和D的取值暗中同意都为0,即除去最大非常的小值,不限制位数。允许的值理论上是-1.7976931348623157E+308~-2.2250738585072014E-308、0和2.2250738585072014E-308~1.7976931348623157E+308。M、D范围如下(MySql5.7实地测量,与IEEE标准测算的莫过于是例外的,上边介绍):

  •    
    M取值范围为0~255。FLOAT只保障6位有效数字的准头,所以FLOAT(M,D)中,M<=6时,数字平日是规范的。假设M和D都有断定概念,其超过范围后的处理同decimal。
  •    
    D取值范围为0~30,同有时候必得<=M。double只保障14位有效数字的准头,所以DOUBLE(M,D)中,M<=16时,数字日常是可信的。借使M和D都有显然概念,其超过范围后的拍卖同decimal。

   
FLOAT和DOUBLE中,若M的概念分别超过7和17,则多出的卓有成效数字有的,取值是不定的,经常数值上会发生错误。因为浮点数是不准确的,所以大家要制止选取“=”来判别七个数是还是不是等于。

    MySql中的浮点数遵从IEEE 754行业内部。

    内部存款和储蓄器中,FLOAT占4-byte(1位标识位 8位代表指数
二十四个人代表倒数),DOUBLE占8-byte(1位符号位 十个人代表指数
五十四位代表尾数)。IEEE754标准还对尾数的格式做了标准:d.dddddd…,小数点左面唯有1位且不能够为零,Computer内部是二进制,因而,尾数小数点左面部分总是1。鲜明,那个1得以节省,以拉长尾数的精度。由上可以知道,单精度浮点数的倒数是用24bit意味的,双精度浮点数的尾数是用53bit表示的。所以就能够算出取值范围和标准的有效位数了,但MySql中实际略有不一样。

浮点数与定点数

为了能够唤起我们的讲究,在介绍浮点数与一定数在此以前先让我们看三个事例:
mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.29 sec)

mysql> insert into test values(131072.32,131072.32);
Query OK, 1 row affected (0.07 sec)

mysql> select * from test;
+———–+———–+
| c1        | c2        |
+———–+———–+
| 131072.31 | 131072.32 |
+———–+———–+
1 row in set (0.00 sec)

从地方的例子中我们看来c1列的值由131072.32改为了131072.31,那正是浮点数的不精确性产生的。

在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数。

浮点数相对于定点数的优点是在长短一定的景色下,浮点数可以代表更加大的数据范围;它的欠缺是会挑起精度难点。在之后有关浮点数和定点数的采纳中,大家要铭记在心以下几点:

  1. 浮点数存在标称误差难题;
  2. 对货币等对精度敏感的数量,应该用定点数表示或存款和储蓄;
  3. 编制程序中,假若用到浮点数,要非常注意引用误差难点,并尽量防止做浮点数比较;
  4. 要留意浮点数中部分特殊值的管理。

 

ref:http://www.w3cschool.cc/mysql/mysql-data-types.html

    2.4、BIT(1)

 
  BIT数据类型可用来保存位字段值。BIT(M)类型允许存款和储蓄M位值。M范围为1~64,默认为1。

    BIT其实正是存入二进制的值,类似010110。

    假如存入四个BIT类型的值,位数少于M值,则左补0.

   
假使存入一个BIT类型的值,位数多于M值,MySQL的操作决意于此时一蹴而就的SQL方式:

  •    
    倘若形式未安装,MySQL将值裁剪到范围的相应端点,并保留收缩好的值。
  •    
    借使情势设置为traditional(“严峻方式”),超过范围的值将被拒绝并提示错误,并且依照SQL规范插入会退步。

    上边是法定示例:

  1. mysql>
    CREATE TABLE t (b BIT(8));
  2. mysql>
    INSERT INTO t SET b = b’11111111′;
  3. mysql>
    INSERT INTO t SET b = b’1010′;
  4. mysql>
    INSERT INTO t SET b = b’0101′;

  1. mysql>
    SELECT b+0, BIN(b+0), OCT(b+0), HEX(b+0) FROM t;
  2. +——+———-+———-+———-+
  3. | b+0 | BIN(b+0) | OCT(b+0) | HEX(b+0) |
  4. +——+———-+———-+———-+
  5. | 255 | 11111111 | 377 | FF |
  6. | 10 | 1010 | 12 | A |
  7. | 5 | 101 | 5 | 5 |
  8. +——+———-+———-+———-+

 

3、字符串类型(14)

 
  字符串类型指CHACRUISER、VARCHA大切诺基、BINA安德拉Y、VARBINA途乐Y、BLOB、TEXT、ENUM和SET。

    3.1、CHAR和VARCHAR类型(2)

 
  CHA奥迪Q3和VARCHA普拉多类型评释的尺寸表示你想要保存的最大字符数。比方,CHA奥迪Q5(30)能够攻下28个字符。私下认可长度都为255。

    CHA汉兰达列的长度固定为开创表时注解的尺寸。长度可以为从0到255的任何值。当保存CHA途胜值时,在它们的右边填充空格以达到钦定的长度。当检索到CHAGL450值时,尾部的空格被剔除掉,所以,大家在存款和储蓄时字符串侧面不能够有空格,固然有,查询出来后也会被删除。在储存或探求进程中不开展高低写调换。

 
  所以当char类型的字段为独一值时,加多的值是还是不是早就存在以不分包末尾空格(只怕有多少个空格)的值分明,相比时会在最后补满空格后与现已存在的值比较。

    VARCHA智跑列中的值为可变长字符串。长度能够钦点为0到65,535里面包车型客车值(实际可钦定的最大尺寸与编码和别的字段有关,比方,自身MySql使用utf-8编码格式,大小为正规格式大小的2倍,独有贰个varchar字段时实地度量最大值仅21844,就算增多三个char(3),则最大取值减弱3。全体最大尺寸是65,532字节)。

   
同CHA途达比较,VARCHAOdyssey值保存时只保留供给的字符数,另加四个字节来记录长度(若是列注脚的长短超越255,则采纳四个字节)。

   
VARCHA凯雷德值保存时不开展填空。当班值日保存和查找时后面部分的空格仍保存,适合标准SQL。

   
假如分配给CHA奥迪Q7或VARCHAPAJERO列的值抢先列的最大尺寸,则对值举办裁剪以使其相符。假设被开除的字符不是空格,则会发出一条警报。纵然裁剪非空格字符,则会招致错误(并不是警戒)并透过利用严谨SQL格局禁止使用值的插入。

    上边展现了将各类字符串值保存到CHAEvoque(4)和VARCHAENCORE(4)列后的结果:

    图片 4

 
  表中最终一行的值只适用在不使用严苛方式时;如果MySQL运营使用严刻形式,超越列长度的值不保留,並且会师世错误。

   
因为空格的原故,一样的值存入到长度都丰裕的varvhar和char中,抽取只怕会差别,例如”a”和”a
 “。

    3.1、BINARY和VARBINARY类型(2)

 
  BINA宝马X3Y和VARBINACR-VY类型类似于CHA宝马7系和VARCHA奥迪Q7类型,但是不一致的是,它们存款和储蓄的不是字符字符串,而是二进制串。所以它们没有字符集,而且排序和比较基于列值字节的数值值。

 
  当保存BINAEnclaveY值时,在它们侧面填充0x00(零字节)值以达到钦赐长度。取值时不删除后面部分的字节。相比时有所字节十分重大(因为空格和0x00是不一样的,0x00<空格),包含OCR-VDER
BY和DISTINCT操作。举例插入’a ‘会形成’a \0’。

 
  对于VARBINACRUISERY,插入时不填充字符,选用时不裁剪字节。相比时拥有字节很首要。

    当类型为BINAOdysseyY的字段为主键时,应怀想地方介绍的仓库储存格局。

    3.2、BLOB和TEXT类型(8)

 
  BLOB是三个二进制大对象,能够包容可变多少的数额。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大尺寸差异。

 
  有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。那个对应4种BLOB类型,有同样的最大尺寸和仓库储存要求。

    BLOB列被视为二进制字符串。TEXT列被视为字符字符串,类似CHA奇骏和BINA景逸SUVY。

    在TEXT或BLOB列的仓库储存或查究进度中,子虚乌有大小写转变。

 
  未运行在从严格局时,若是你为BLOB或TEXT列分配八个高出该列类型的最大尺寸的值,值被截取以管教符合。假如截掉的字符不是空格,将会发生一条警报。使用严苛SQL格局,会发出错误,并且值将被驳回并非截取并付诸警报。

    在大多数上面,能够将BLOB列视为能够充分大的VARBINA路虎极光Y列。同样,能够将TEXT列视为VARCHAKoleos列。

    BLOB和TEXT在以下多少个方面不相同于VARBINAGL450Y和VARCHA奥迪Q7:

  •    
    当保存或检索BLOB和TEXT列的值时不删除尾部空格。(那与VARBINAEnclaveY和VARCHARubicon列同样)。 
  •    
    相比较时将用空格对TEXT进行扩大以合乎相比较的对象,正如CHAGL450和VARCHARAV4。
  •    
    对于BLOB和TEXT列的目录,必得钦命索引前缀的长短。对于CHAOdyssey和VARCHA安德拉,前缀长度是可选的。
  •     BLOB和TEXT列无法有暗中认可值。

    MySQL
Connector/ODBC将BLOB值定义为LONGVARBINAPRADOY,将TEXT值定义为LONGVARCHA中华V。

   
BLOB或TEXT对象的最大尺寸由其品种分明,但在客商端和服务器之间实际能够传递的最大值由可用内部存款和储蓄器数量和通讯缓存区大小明确。你能够经过改换max_allowed_packet变量的值退换信息缓存区的尺寸,但必得同期修改服务器和顾客端程序。

    每个BLOB或TEXT值分别由中间分红的对象表示。

    它们(TEXT和BLOB同)的长度:

  •     Tiny:最大尺寸2伍拾个字符(2^8-1)
  •     BLOB或TEXT:最大尺寸655三13个字符(2^16-1)
  •     Medium:最大尺寸16777217个字符(2^24-1)
  •     LongText 最大尺寸4294967294个字符(2^32-1)

    实际尺寸与编码有关,比方utf-8的会扣除。

    3.3、ENUM(1)

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

    能够插入空字符串””和NULL:

  •    
    如若你将一个违规值插入ENUM(约等于说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串分化,该字符串有数值值0。
  •    
    即便将ENUM列注脚为允许NULL,NULL值则为该列的四个得力值,并且暗许值为NULL。如若ENUM列被声称为NOT
    NULL,其暗中同意值为允许的值列的第三个要素。

    值的目录法规如下:

  •     来自列规定的允许的值列中的值从1始发编号。
  •    
    空字符串错误值的索引值是0。所以,能够运用上边包车型客车SELECT语句来找寻分配了违法ENUM值的行:mysql>
    SELECT * FROM tbl_name WHERE enum_col=0;
  •     NULL值的目录是NULL。

    如下例:

    图片 5

 
  ENUM最多能够有65,531个成分。当成立表时,ENUM成员值的尾巴空格将机关被剔除。

    使用方法:

  1. CREATE TABLE shirts (
  2. name VARCHAR(40),
  3. size ENUM(‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’)
  4. );

  1. INSERT INTO shirts (name, size) VALUES (‘dress shirt’,’large’),(‘t-shirt’,’medium’),(‘polo
    shirt’,’small’);

  1. SELECT name,
    size FROM shirts WHERE size =
    ‘medium’;

  1. UPDATE shirts SET size = ‘small’ WHERE size
    = ‘large’;

    即使将赶回值设为数值,将重返索引值,举个例子讲下边的查询语句改为:

  1. SELECT name,
    size+0 FROM
    shirts WHERE size = ‘medium’;

 
  就算将贰个数字保存到ENUM列,数字被视为索引,况兼保留的值是该索引对应的枚举成员(那不切合LOAD
DATA,它将具备输入视为字符串)。不提议选取类似数字的枚举值来定义叁个ENUM列,因为那很轻易孳生混淆。

 
  ENUM值根据索引编号举办排序)。譬如,对于ENUM(‘a’,’b’),’a’排在’b’前边,但对此ENUM(‘b’,’a’),’b’排在’a’后边。空字符串排在非空字符串前边,况且NULL值排在全数别的枚举值前面。要想幸免意外的结果,按字母顺序分明ENUM列。还足以应用GROUP
BY CAST(col AS CHACR-V)或GROUP BY
CONCAT(col)来确认保证根据词汇对列进行排序并非用索引数字。

    3.4、SET类型(1)

 
  SET是叁个字符串对象,能够有零或四个值,其值来自表创立时规定的允许的一列值。内定包含八个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开分离。比方,钦定为SET(‘one’,
‘two’) NOT NULL的列能够有上边包车型客车其余值:

  •     ”
  •     ‘one’
  •     ‘two’
  •     ‘one,two’

   
SET最多能够安装六17个值。创设表时,SET成员值的尾巴部分空格将自动被删除。检索时,保存在SET列的值使用列定义中所使用的大小写来呈现。

 
  MySQL用数字保存SET值,所保存值的低阶位对应第4个SET成员。假如在数值上下文中检索三个SET值,检索的值的位设置相应组成列值的SET成员。

    举例,能够那样从叁个SET列车检查索数值值:

  1. mysql>
    SELECT set_col+0 FROM tbl_name;

 
  假如将二个数字保存到SET列中,数字的二进制的1的岗位明确了列值中的SET成员。对于钦赐为SET(‘a’,’b’,’c’,’d’)的列,成员有上边包车型客车十进制和二进制值:

    图片 6

 
  倘使你为该列分配一个值9,其二进制方式为1001,因而第四个和第1个SET值成员’a’和’d’被挑选,结果值为
‘a,d’。

   
对于包罗多个SET成分的值,当插入值时成分所列的各类并不重大。在值中贰个加以的成分列了不怎么次也不根本。当现在检索该值时,值中的每一个成分出现二次,依照表创制时钦点的次第列出成分。比如,假定有些列钦赐为SET(‘a’,’b’,’c’,’d’):

  1. CREATE TABLE myset (col SET(‘a’, ‘b’, ‘c’, ‘d’));
  2. INSERT INTO myset (col) VALUES (‘a,d’), (‘d,a’), (‘a,d,a’), (‘a,d,d’), (‘d,a,d’);
  3. SELECT *,col+0 FROM myset;
  4. SELECT *,col+0 FROM myset where
    col=’a,b’;

    结果:

  1. a,d 9
  2. a,d 9
  3. a,d 9
  4. a,d 9
  5. a,d 9

    SET值按数字顺序排序。NULL值排在非NULL SET值的前方。

    常常意况,能够利用FIND_IN_SET()函数或LIKE操作符寻觅SET值:

    mysql> SELECT * FROM tbl_name WHERE
FIND_IN_SET(‘value’,set_col)>0;

    mysql> SELECT * FROM tbl_name WHERE set_col LIKE ‘%value%’;

    第3个语句找寻SET_col包括value
set成员的行。第三个八九不离十,但有所不一样:它在其余地方找寻set_col满含value的行,以致是在另贰个SET成员的子字符串中。

    上面包车型地铁言语也是官方的:

    mysql> SELECT * FROM tbl_name WHERE set_col & 1;

    mysql> SELECT * FROM tbl_name WHERE set_col = ‘val1,val2’;

   
第3个语句寻觅饱含第4个set成员的值。第3个语句搜索三个正合分寸相配的值。应留意第2类的可比。将set值与’val1,val2’比较重临的结果与同’val2,val1’比较再次回到的结果差异。钦赐值时的相继应与在列定义中所列的逐个一样。

    假诺想要为SET列明确全数一点都不小希望的值,使用SHOW COLUMNS FROM tbl_name
LIKE set_col并剖析输出中第2列的SET定义。

    有如何实际运用呢?

   
比方我们设定顾客的权能决定,二个顾客恐怕会有多样权力,我们运用全体权力创制二个SET类型的字段,大家不要求用一多元int来定义各个权力了,直接使用二个SET字段就能够:

  1. /*
  2. 客户权限permission表
  3. */
  4. create table user_permission(
  5. id int
    UNSIGNED not null auto_increment,
  6. user_id int
    not null ,
  7. permission set(‘阅读’,’评论’,’发帖’) not null,
  8. primary key(id),
  9. unique (user_id)
  10. );
  11. desc user_permission;
  12. insert into
    user_permission values (0,1,’阅读’),(0,2,’阅读’),(0,3,’阅读,评论’);
  13. insert into
    user_permission values (0,4,’阅读,评论,发帖’);
  14. select *,permission+0 from user_permission;
  15. select permission from user_permission where user_id=1;
  16. select * from
    user_permission where
    permission & 10;
  17. SELECT * FROM
    user_permission WHERE FIND_IN_SET(‘评论’,permission)>0;

 

4、时间日期类型(5)

    他们的“0”值如下:

    图片 7

    4.1、DATE, DATETIME, 和TIMESTAMP类型(3)

    那三者其实是关系的,都用来表示日期或时刻。

    当您必要同有时间饱含日期和时间新闻的值时则利用DATETIME类型。MySQL以’YYYY-MM-DD
HH:MM:SS’格式检索和展现DATETIME值。帮忙的限量为’1000-01-01 00:00:00’到’9999-12-31
23:59:59’。

    当你只要求日期值而无需时刻有些时应运用DATE类型。MySQL用’YYYY-MM-DD’格式检索和彰显DATE值。扶助的界定是’1000-01-01’到 ‘9999-12-31’。

    TIMESTAMP类型同样包罗日期和岁月,范围从’一九七零-01-01
00:00:01′ UTC 到’2038-01-19 03:14:07′ UTC。

    能够采用任何常见格式内定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’格式的从没有过间割符的字符串,假定字符串对于日期类型是有意义的。例如,’19980523091528’和’970523091528’被解说为’一九九八-05-23
    09:15:28’,但’971122129015’是违规的(它有二个并没风趣的分钟部分),将改为’0000-00-00
    00:00:00’。
  •    
    ‘YYYYMMDD’或’YYMMDD’格式的未有间割符的字符串,假定字符串对于日期类型是有含义的。举例,’一九九六0523’和’970523’被分解为
    ‘1996-05-23’,但’971332’是不合规的(它有三个一直不意义的月和日部分),将成为’0000-00-00’。
  •    
    YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字,假定数字对于日期类型是有含义的。比方,19810905132800和830905132800被讲明为
    ‘一九八一-09-05 13:28:00’。
  •    
    YYYYMMDD或YYMMDD格式的数字,假定数字对于日期类型是有含义的。举个例子,19840905和830905被演讲为’1982-09-05’。
  •    
    函数重返的结果,其值适合DATETIME、DATE恐怕TIMESTAMP上下文,举例NOW()或CULANDRENT_DATE。

 
  对于包括日期部分间割符的字符串值,假设日和月的值小于10,无需钦点两位数。’1976-6-9’与’一九七九-06-09’是均等的。同样,对于包罗时间部分间割符的字符串值,即使时、分和秒的值小于10,无需内定两位数。’一九七八-10-30
1:2:3’与’1978-10-30 01:02:03’同样。

 
  数字值应该为6、8、12也许十几人长。即使一个数值是8或16位长,则只要为YYYYMMDD或YYYYMMDDHHMMSS格式,前4位数表示年。倘使数字
是6或拾壹个人长,则只要为YYMMDD或YYMMDDHHMMSS格式,前2位数表示年。别的数字被演说为临近用零填充到了多年来的长短。

 
  钦定为非限定符字符串的值使用给定的长度实行解释。假如字符串为8或14字符长,前4位数表示年。否则,前2位数表示年。从左向右解释字符串内冒出的各部分,以开采年、月、日、小时、分和秒值。那表达不应使用轻易6字符的字符串。譬如,假如你钦定’9903’,感觉它意味着1998年九月,MySQL就要您的表内插入贰个“零”日期值。那是因为年和月值是99和03,但日部分完全不见,由此该值不是一个法定的日期。不过,能够显著内定三个零值来代表贫乏的月或日部分。举例,能够使用’990300’来插入值’1996-03-00’。

   
能够将一个日子类型的值分配给叁个例外的日期类型。可是,值恐怕会转移或错失一些新闻:

  •    
    若是你为一个DATETIME或TIMESTAMP对象分配一个DATE值,结果值的日子部分被设置为’00:00:00’,因为DATE值未包蕴时间音讯。
  •    
    假诺您为一个DATE对象分配贰个DATETIME或TIMESTAMP值,结果值的岁月部分被剔除,因为DATE值未包罗时间新闻。
  •    
    记住尽管能够采纳同样的格式钦点DATETIME、DATE和TIMESTAMP值,差别档期的顺序的值的限量却今非昔比。譬如,TIMESTAMP值不能够早于一九七〇或晚于2037。那证雅培个日期,譬如’一九六九-01-01’,即使对于DATETIME或DATE值是实用的,但对于TIMESTAMP值却不著见效,若是分配给这么叁个目的将被转变为0。

    当钦赐日期值时请留神有些缺陷:

  •    
    钦命为字符串的值允许的非严厉格式恐怕会期骗。比如,值’10:11:12’由于‘:’间割符看上去恐怕象时间值,但假设用于日期前后文值则被分解为年’2010-11-12’。值’10:45:15’被转移为’0000-00-00’因为’45’不是合法月。
  •    
    在非严刻格局,MySQL服务器只对日期的合法性实行基本检查:年、月和日的界定分别是1000到9999、00到12和00到31。任何带有当先这个限制的有的的日子被转变到’0000-00-00’。请细心如故允许你保存非法日期,比方’2000-04-31’。要想确定保障不应用严俊方式时日期有效,应检查应用程序。
    在严酷方式,违规日期不被接受,并且不改造。
  •    
    包蕴两位年值的日子会令人歪曲,因为世纪不领悟。MySQL使用以下法规解释两位年值:
    o 00-69范围的年值转变为两千-2069。 o
    70-99限制的年值转换为一九六九-一九九七。

    种种相关操作:

    4.2、TIME类型(1)

 
  MySQL以’HH:MM:SS’格式检索和体现TIME值(或对于大的小时值采用’HHH:MM:SS’格式)。

   
TIME值的范围能够从’-838:59:59’到’838:59:59’。时辰部分会因而大的案由是TIME类型不仅可以够用于表示一天的时刻(必需低于24钟头),还大概为有个别事件过去的时日或多个事件之间的日子间距(能够高于24小时,也许乃至为负)。

    你能够用各个格式钦点TIME值:

  •     ‘D
    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上下文,比如CUGL450RENT_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’照旧违规的值。

    4.3、YEAR类型(1)

    YEA安德拉类型是叁个单字节类型用于表示年。

    MySQL以YYYY格式检索和展现YEA锐界值。范围是1905到2155。

    能够钦定各类格式的YEACR-V值:

  •     四位字符串,范围为’一九零一’到’2155’。
  •     四个人数字,范围为一九零四到2155。
  •    
    两位字符串,范围为’00’到’99’。’00’到’69’和’70’到’99’范围的值被转变为3000到2069和一九七零到一九九七范围的YEARAV4值。
  •    
    两位整数,范围为1到99。1到69和70到99限制的值被撤换为2004到2069和一九六八到一九九六限量的YEA奥迪Q5值。请留神两位整数范围与两位字符串范围稍有不一致,因为你不能够直接将零钦定为数字并将它表明为3000。你必须将它内定为一个字符串’0’或’00’或它被讲明为0000。
  •     函数重回的结果,其值符合YEA奥迪Q5上下文,例如NOW()。

    违规YEA福特Explorer值被撤换为0000。

 

5、几何类型(8)

    几何类型等级次序结构如下:

    图片 8

    到用的时候再说吧。

   
官方文书档案:http://dev.mysql.com/doc/refman/5.7/en/opengis-geometry-model.html

 

6、各类别型占用的积攒

    6.1、数值类型

    图片 9

    定点数的可比卓越,况兼与具体版本也会有涉嫌,此处单独解释:

 
  使用二进制格式将9个十进制(基于10)数收缩为4个字节来代表DELIVINAL列值。每一个值的整数和分数部分的蕴藏分别规定。每一种9位数的翻番需求4个字节,何况“剩余的”位需求4个字节的一片段。下表给出了超越位数的储存需要:

    图片 10

    6.2、时间日期

    图片 11

   
从版本5.6.4伊始,存款和储蓄必要就具有更改,依照精度而定。不明确部分供给的囤积如下:

    图片 12

    譬喻,TIME(0), TIME(2), TIME(4), 和TIME(6) 分别选取3, 4, 5, 6
bytes。

    6.3、字符串

    图片 13

 

7、类型的取舍

    为了优化存款和储蓄,在另外动静下均应运用最确切的种类。

    比方,假若列的值的范围为从1到99999,若使用整数,则MEDIUMINT
UNSIGNED是好的项目。在有着能够表示该列值的品种中,该项目应用的贮存起码。

    用精度为69位十进制数(基于10)对DE奥迪A6L
列进行富有骨干计算(+、-、*、/)。

   
使用双精度操作对DE科鲁兹L值进行测算。如若准确度不是太重大或只要速度为最高优先级,DOUBLE类型即丰盛了。为了完结高精度,能够转移到保存在BIGINT中的定点类型。那样能够用陆拾一个人整数进行富有计算,依照需求将结果转变回浮点值。

 

8、使用任何数据库的SQL语句

 
  为了选拔为任何数据库编写的SQL实行代码,MySQL依据下表所示对列类型实行映射。通过那一个映射,能够很轻巧地从别的数据库引擎将表定义导入到MySQL中:

    图片 14

 


   
其实,字段类型相关知识,远不仅那点,还会有为数不少。实际情况请访问官方网址:http://dev.mysql.com/doc/refman/5.7/en/data-types.html

留下评论

网站地图xml地图