澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

mysql数据类型,选择优化的数据类型

2019-10-30 作者:数据库网络   |   浏览(167)

先说一下mysql中DATETIME和TIMESTAMP的界别


  1. 接收最小的数据类型,因为它们占越来越少的磁盘,内存和CPU缓存;

  2. 选拔轻便的数据类型,如用整型来积累ip: 

  3. 防止null,因为null会占用存款和储蓄空间,null在索引列上会使索引更复杂

     

整形

TIMESTAMP是标准的unix timestamp,它存款和储蓄的是一九六六-1-1到现行反革命因而的秒数,4字节积累。mysql用那些体系还蛮方便的,二个是有众多置于的函数和trigger来处理它,举例CURRENT_TIMESTAMP宏,最要害的是在取多少的时候mysql会自行帮你管理DST和时区的主题材料。

title: mysql-数据类型
date: 2016-12-28 17:42:45
tags:
categories: mysql

莫西干发型门类


DATETIME的限制更加大,好像可以从0000-00-00 00:00:00到9999-12-31 23:59:59,8字节囤积,当然mysql内部肯定也是用整数并不是字符串的(说了是8字节了),所以效用不是大难点。但DATETIME不带时区,比方本人在先后里生成了一个二〇一六-05-07 15:26:00的时间(实际上是 8时区的,但那些指标恐怕是timezone naive)的,存到mysql里,再从分歧的时间区的地点拿出去,那么些时间恐怕就混了。


  1. TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 分别选用8,16,24,32,六二十人存款和储蓄空间;

  2. 选拔unsigned属性,能够使正数的上限进步黄金年代倍;

  3. 使不应用unsigned属性,跟品质毫无干系;

  4. int(1)和int(10)对存款和储蓄和总结的话是大器晚成律的,只是规定部分mysql交互工具用来限定突显字符的个数;

  • INT                      4bytes      0-2^(4*8)
  • SMALLINT            2bytes      0-2^(2*8)
  • MEDIUMINT         3bytes      0-2^(3*8)
  • BIGINT                8bytes      0-2^(8*8)
  • TINYNIT              1bytes      0-2(1*8)

但TIMESTAMP也会有八个超级大的难点:

《高质量mysql》第4章读书笔记

实数类型

特出难点:

  1. 4字节长度限定,它只可以到2038年
  2. 繁多时候大家期待依据顾客所在地的时区呈现时间并不是光呈现五个服务器时间

数字类型

mysql的数字大致分为三种整数类型和实数类型(既小数类型)

  1. 能够运用DELIVINAL存款和储蓄比BIGINT还大的莫西干发型;

  2. CPU不援助DEVEZELL直接总结,MYSQL服务器自己达成了DEPhaetonL的高精度运算,相对来讲,CPU间接扶植浮点运算,所以浮点运算显著更加快;

  3. float占用4个字节,double占用8个字节;

  4. DE卡罗拉L须求额外的空仲春总计花费,所以尽量少用它;

  5. DE迈腾L能够动用BIGINT代替,把小数乘以好好几倍存款和储蓄在BIGINT里面,能够制止浮点存款和储蓄总结不许确和DESagitarL精度总括代价高的主题材料;

int(11) VS int(21)

于是相比较好的做法是,数据库中央银行使DATETIME,然后存时间的时候意气风发律用程序生成UTC时间(而不是local时区的时间)存进去,抽出来的时候不管想彰显服务器时间或许展现客户的光阴都得以拍卖。

卡尺头门类

TINYINT SMALLINT MEDIUMINT INT BIGINT
8位 16位 24位 32位 64位

mysql中按从小到大学一年级个多样整数品类,对应在java应用中,大家通平时常使用int对应java的integer,bigint对应java的long,因为java的integer刚好是4个字节,long8个字节。

留意创设表的时候整数类型后边的括号,比方int(3),并非表示能够有最多3个字符的平头,既-999到999。它的下马看花功效是约束某个客商端工具展现数字的时候只展现……3个数!所以实际没啥用,带不带都能够

大背头和小数类型都足以带上 unsigned,表示不不存负数,那样能够大学一年级位。举例tinyint本来是-128~127,而unsigned tinyint表示 0~255

字符串类型

存款和储蓄空间,照旧存款和储蓄范围是未有任何差其他。

附带提一句,依据顾客所在地时区呈现时间有两种做法:

实数类型

float和double分别攻克4个字节和8个字节。当超越位数后,依据四舍五入保存相通值。那在保存零钱之类的高精度数字时是很危险的,所以就别用好了!

float和double同不时候也得以使用如float(5,2)这样的样式来强制规定,小数位 整数位后生可畏共只好5位,小数位只保留2位。当个位数超过时,mysql拒却插入,当小数位抢先时,4舍五入。可是这实则及其令人吸引。

并且当您用相关列做标准查询时,未有在括号中制订精度的float会导致查询退步,必得指定精度

比如

money字段 设置为float,

insert into table (num) values (0.12);

select * from table where num=0.12的话,查不出任何数据。

而大器晚成旦内定了精度,比方money float(6,2) //超越6位就最初取肖似值了

insert into table (num) values (0.12);

select * from table where num=0.12的话,得到数码。

相对来讲decimal(m,n)更便于明白,就是最多m位,小数最多n位领前后相继四舍五入(据悉某些3.0之下的本子因为是转变到double之类的花色,行为不相仿)

decimal的优势在于不会莫明其妙的在整数位四舍五入,不过在任然要留心超越限制后,小数位的四舍五入是不是是你想要的,或许直接用bigint存款和储蓄你的数字好了,存取的时候乘除相应的小数位就可以

  1. varchar供给贰个依然四个附加的字节记录字符串长度,varchar列的长度小于或等于252个字节须求叁个字节,大于255亟需八个字节;

  2. varchar 用于存款和储蓄可变长字符串,它比定长类型更节省空间;

  3. char相符储存超短的字符串,大概具备值都挨近同一个长短;

  4. 对于日常改动的数据,char比varchar越来越好,因为定长的char类型不易于产生碎片;

  5. 对此仓库储存超短的列,char存款和储蓄空间比varchar少,如存款和储蓄“Y”或"N",接纳单字节字符集,char(1)占用八个字节;varchar(1)占用三个字节;

  6. 当存款和储蓄char值时,mysql会去除全数末尾空格,char值会遵照要求选择空格进行填写相比较;

  7. varchar(5)和varchar(200)存储"hello"的上空开荒是风华正茂致的。但越来越长的列会消耗越来越多的内部存款和储蓄器,因为mysql平常会分配一定大小的内部存款和储蓄器块来保存内部值;

     

那正是说在mysql中两方其实存款和储蓄会是何许的生龙活虎种意况吧?

  1. 当客商率先次访谈网址的时候,用js获取时区发送到服务器上存到session里
  2. 用js处理时间的来得(小编觉着这种比较便于一点,终归不用改服务端代码)

字符串类型

BLOB和TEXT类型

 

接收这种做法的有一无二弱点是sqlite3未有internal的DATETIME类型,所以在ORM框架如sqlalchemy中,它会向来存字符串进去。(sqlite3的文书档案也说,你要么存成int要么real要么字符串)。就算那说不定带来一些不便利和性质的下降,但自己以为如故切合“keep it simple and stupid”的法则。

char和varchar

前端是定长,后面一个是边长

普通在innodb引擎中大家都接收varchar。

唯只不常在存的数据长度一定期,举例居民身份证。

恐怕值平日转移的字段使用char,省掉总结数据长度的时刻,mysql会快点。

比较奇异的是使用char的时候,字符串末尾就算是空格,会被截断,不被存下来。

除此以外varchar(2)代表的能够存2个字符,无论你是存的汉语照旧保加波德戈里察语都以2个,跟oracle差异。

  1. BLOB和TEXT分别选取二进制和字符存款和储蓄;

  2. MYSQL无法将BLOB和TEXT列全体长短字符串进行索引,也不能够用那一个索引湮灭排序;

create table t (a int(11) zerofill,b int(21) zerofill);
insert into t values (1,1);
mysql> select * from t;
 ------------- ----------------------- 
| a           | b                     |
 ------------- ----------------------- 
| 00000000001 | 000000000000000000001 |
 ------------- ----------------------- 
1 row in set (0.00 sec)

至于用INT存时间,是另生机勃勃种有效的不二等秘书技,参见http://www.liaoxuefeng.com/article/0014132675721847f569c3514034f099477...
本人个人不是很欢愉这样做,因为如此您一定要把模型中象征时间的分子声称为int类型。那样是相比不切合逻辑的(那一个Date呀Datetime之类的类就从未有过用了哟,最多就有个Dateutil就好了),而且会使得程序不易读(卧槽那些publishedDate为什么是int,它究竟意味着的是岁月啊?)。由此可见众口难调。

blob和text

额,考虑用nosql来存吧。

日子和时间项目

要是不加zerofill:

日子项目

  1. MYSQL可以积存的微小时间是秒;

  2. DATETIME能保留大规模的值,从1001年到9999年,精度为秒。它把日子和时间封装到格式为YYYYMMDDHHMMSS的大背头中,与时区毫不相关,使用8个字节存款和储蓄;

  3. 暗中认可景况下,MYSQL以风流倜傥种有各样,无歧义的格式突显DATETIME值,比如"二〇一四-12-12 12:12:12";

  4. TIMESTAMP 用4个字节存款和储蓄,和UNIX时间戳相通,它只可以表示一九六九年到2038年,它的显得格式比方"2016-12-12 12:12:12";;

  5. MYSQL提供了FROM_UNIXTIME()函数把UNIX时间戳调换来日期,并提供UNIX_TIMESTAMP()函数把日子转为UNIX时间戳;

  6. TIMESTAMP 正视于时区;

  7. 当插入或退换记录时,假诺TIMESTAMP未有一些名值,TIMESTAMP暗中同意会保存当前时光;

  8. TIMESTAMP比DATETIME的长空作用更加高,尽量筛选TIMESTAMP;

  9. 能够行使BIGINT存款和储蓄微妙级其余日子戳,也许应用DOUBLE保留秒之后的小数部分;

mysql> create table t (a int(11),b int(21));
mysql> insert into t values(1,1);
mysql> SELECT * FROM t;
 ------ ------ 
| a    | b    |
 ------ ------ 
|    1 |    1 |
 ------ ------ 
1 row in set (0.00 sec)

DATETIME和TIMESTAMP

2者在展现的精度上并无分裂,都以准确到秒

区别的是datetime底层存的实乃格式为YYYYMMDDHHMMSS,使用8个字节存款和储蓄的大背头中,所以实际这一个类型是从鸡时区的概念的,你存的略微正是微微。

唯独timestamp是将您存的光阴依据时区存为了unixtime,只占用4个字节。

由此其出示也依赖于mysql server上的时区,所以它必须要存到2038年为上限,存款和储蓄一些前程时刻的时候要细心(不留神也没涉及,反正你存不步向)。

卓绝类型数据

则两个未有别的区别;所以int(11),int(21)本质上一直不任何差别,仅仅是在少数场景的显得上有点分别;

date和time

当您只想保留年月日照旧时分秒时使用

1.IPv4地址平常被人用varchar(15)来囤积,但是它三14个人无符号的卡尺头,小数点将地点分四段只是为着令人轻便阅读,所以整型来存款和储蓄它,MYSQL用INET_ATON() 和INET_NTOA()用于这二种表示调换;

 

 

浮点型


  • FLOAT(M,D)      4byte   单精度         非精确
  • DOUBLE(M,D)   8byte    双精度        非精确(比float精度高)

M,代表小数点左右两侧总的位数

D,小数点侧边大家改为标度的位数

 

 

精度错过难题:

  • 精度错过:若是集团工资用了float类型,恐怕会见世工资四舍五入难点

例子:

mysql> CREATE TABLE t ( a int(11) DEFAULT NULL, b float(7,4) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> INSERT INTO t VALUES (2,123.12345);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM t ;
 ------ ---------- 
| a    | b        |
 ------ ---------- 
|    2 | 123.1235 |
 ------ ---------- 
1 row in set (0.00 sec)

那儿float便冒出了四舍五入的气象;

 

DE西玛L定点数:更加准确的数字类型

  • 高精度数据类型,常用来积攒交易有关的数量
  • DE捷达L(M,N),M代表总精度,N代表小数点左边的位数(标度)
  • 1<M<254,0<N<60
  • 储存空间变长

例子

mysql> show create table aa;
 aa    | CREATE TABLE `aa` (
  `a` decimal(18,9) DEFAULT NULL,
  `b` decimal(9,4) DEFAULT NULL,
  `c` decimal(3,2) DEFAULT NULL,
  `f` float(3,2) DEFAULT NULL,
  `d` double(3,2) DEFAULT NULL

瞩目:依照存取的数目,decimal的积累空间活动转变;

mysql> select * from aa ;
 ------------- -------- ------ ------ ------ 
| a           | b      |  c   | f    | d    |
 ------------- -------- ------ ------ ------ 
| 5.500000000 | 5.5000 | 5.50 | 5.50 | 5.50 |
 ------------- -------- ------ ------ ------ 
2 rows in set (0.00 sec)

mysql> select length(a),length(b),length(c),length(f),length(d) from aa;
 ----------- ----------- ----------- ----------- ----------- 
| length(a) | length(b) | length(c) | length(f) | length(d) |
 ----------- ----------- ----------- ----------- ----------- 
|    11     |       6   |     4     |     4     |       4   |
 ----------- ----------- ----------- ----------- ----------- 

#每一个数字(包括标点)都占一个字符;小数部分没有达到位数的用0补齐,整数部分有多少算多少;

 

mysql> insert into aa values(5.5,5.5,55.5,55.5,55.5);
mysql> select * from aa;
 ------------- -------- ------ ------ ------ 
| a           | b      | c    | f    | d    |
 ------------- -------- ------ ------ ------ 
| 5.500000000 | 5.5000 | 9.99 | 9.99 | 9.99 |

#超出范围取范围中最大的值,比如总个3位,小数有2两位,则他们最大的值就是9.99; 

经验之谈:

  • 仓库储存性别,省份,类型等分类新闻的时候选取TINIYINT只怕ENUM(占字节少)
  • BIGINT存款和储蓄空间越来越大,INT和BIGINT之间常常选用BIGINT
  • 贸易等高精度数据时精选使用DELevinL

 

字符型


储存客户名的品质:

  • CHAR        字符
  • VARCHAR  字符
  • TEXT  

字符和字节的分歧:

 

编码输入的字符串 网易 netease
gbk(双字节) varchar(2)/4字节 varchar(7)/7字节
utf8(三字节) varchar(2)/6字节 varchar(7)/7字节
utf8mb4(四字节) varchar(2)/? varchar(7)/7字节

 

 

 

 

 

utf8mb4尽管说每种汉字占4个字节,然而个中有规定,若是utf8能够存的下的则

还动用utf8行业内部,这里存款和储蓄天涯论坛八个字显著utf8可以化解,所以那个时候?中应当是6个

字节,假若说存款和储蓄的多了utf8搞不定,则用每二个中黄炎子孙民共和国字4个字节来积攒,就是8个字节。

 

emoji表情:

  • mysql>5.5.3
  • 库和表的字符集设为utf8mb4

CAHR与VARCHAR区别:

  • char存款和储蓄定长,轻便形成空间浪费
  • varchar存款和储蓄变长,节省空间
  • char的管理速度比varchar快因为char是从来长度
  • char会对行尾空格实行管理

澳门新萄京官方网站 1

例子:

mysql> show create table vc;
| vc    | CREATE TABLE `vc` (
  `v` varchar(5) DEFAULT NULL,
  `c` char(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
1 row in set (0.00 sec)

#注意AB后面都有一个空格
mysql> INSERT INTO vc VALUES('AB ','AB ');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * from vc;
 ------ ------ 
| v    | c    |
 ------ ------ 
| AB   | AB   |
 ------ ------ 
1 row in set (0.00 sec)

#可以看到char会对行尾空格删掉,而varchar不会;
mysql> select concat(v,' '),concat(c,' ') from vc;
 --------------- --------------- 
| concat(v,' ') | concat(c,' ') |
 --------------- --------------- 
| AB            | AB            |
 --------------- --------------- 
1 row in set (0.00 sec)

 

 

TEXT与CHAR和varchar的区别:

  • CHACRUISER和VARCHAEnclave存款和储蓄单位为字符
  • TEXT存款和储蓄单位为字节,总大小为65535字节,约64kb
  • CHAKuga数据类型最大为255字符
  • VARCHA大切诺基存款和储蓄类型为变长;
  • TEXT在数据库内部比很多存款和储蓄格式为溢出页,效用不及CHA迈凯伦570

 

mysql数据类型,选择优化的数据类型。仓库储存头像:

  • BLOB
  • BINARY

 

即便如此能够,可是特别不引入;不引进在数据Curry直接存二进制文件;效用会十分的低;那二进制怎么样存取?

 

blob和text值会引起局地品质难点,特别是在施行了大量的删除操作时,会生出”空洞“

所谓空洞,即即便已经删除,不过系统还并没有回笼,要动用optimize table tbl 来打理碎片。

删去操作会在数据表中留给非常大的虚幻,以后填入那几个抽象的记录在插入的属性上会有震慑。提出准期选取OPTIMIZE TABLE tbl 来整理碎片

 

 

经验之谈:

  • CHAXC60与VARCHALacrosse定义的长短是字符长度不是字节长度
  • 储存字符串推荐选取使用VARCHACR-V(N),N尽量小
  • 就算如此数据库能够储存二进制数据,然则质量低下,不要使用数据仓库储存款和储蓄文件音频等二进制数据

 

 

仓库储存寿辰新闻:

  • DATE                三字节,如2015-05-01
  • TIME                三字节,如11:12:00
  • DATETIME        八字节,如2015-05-01 11:12:00
  • TIMESTAMP      四字节,如2015-05-01 11:12:00
  • BIGINT

 

TIMESTAMP vs DATETIME

   存款和储蓄范围的分别 :

   TIMESTAMP         1970-01-01 00:00:01 to 2038-01-19 03:14:07

   DATETIME           1000-01-01 00:00:00 to 9999-12-31 23:59:59

 

   字段类型与时区的涉嫌:

   TIMESTAMP会根据系统时区实行改造,DATETIME则不会

 

 

把现行反革命的时刻调换到了BIGINT类型的数据来囤积;

mysql> select UNIX_TIMESTAMP (now());
 ------------------------ 
| UNIX_TIMESTAMP (now()) |
 ------------------------ 
|             1461728217 |
 ------------------------ 
1 row in set (0.00 sec)

mysql> select from_unixtime(1461728217);
 --------------------------- 
| from_unixtime(1461728217) |
 --------------------------- 
| 2016-04-27 11:36:57       |
 --------------------------- 
1 row in set (0.00 sec)

 

 

 总结:

  1.   整形杰出难题--int(11),int(21) 
  2.   浮点型精度遗失
  3.   DE科沃兹L变长存款和储蓄空间
  4. 澳门新萄京官方网站,  varchar,char区别
  5.   mysql,concat(v,' ')连接字段  
  6. BIGINT存时间:
    1. select UNIX_TIMESTAMP (now());
    2. mysql数据类型,选择优化的数据类型。select FROM_UNIXTIME (1468842905);  

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:mysql数据类型,选择优化的数据类型

关键词: