本文主要介绍了MySQL 的常用数据类型,以及实际应用时如何选择合适的类型。

 ******几个通用的简单原则:*******

1. 更小的通常更好。但是要确保没有低估需要存储的值的范围,如果无法确定哪个数据类型是最好的,就选择不会超出范围的最小类型。

2. 简单就好。优先选择MySQL内建的类型而不是字符串来存储日期,时间。

3. 尽量避免NULL。可为NULL的列会使得索引的优化比较复杂。

***********************************************

一:数值类型(标亮的为MySQL 扩展的)

几个需要注意的使用细节:

1. int 可指定宽度,如int(5), 不指定默认为int(11)。注意,这对大多数应用是没意义的,他不会限制类型合法的范围,仅仅是规定了MySQL的一些交互工具显示字符的个数。

2. 在插入NULL到一个AUTO_INCREMENT列时,MySQL插入一个比该列最大值大1的值,一个表中最多只能有一个AUTO_INCREMENT列。对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL,并定义为PRIMARY KEY或定义为UNIQUE键

3. 对于小数的表示,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数则只有decimal一种表示。定点数在MySQL内部以字符串形式存放,是在MySQL服务器内部实现的,一方面比浮点数更精确,适合用来表示货币等精度高的数据,另一方面,不如CPU原生的浮点型运算快。

4.浮点数和定点数都能用(M,D)限定位数,但浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用

5. float和double使用系统默认值限定位数,decimal默认(10,0)

6.数据插入bit类型字段时,首先转换为二进制,如果位数允许,将成功插入;如果位数小于实际定义的位数,则插入失败,查看时需用bin(name)或者hex(name)查看,否则会显示空

数值型总结:(1)整型:优先考虑符合存储范围的最小类型。

(2)小数:对精度要求不是特别高,选择浮点型,否则定点型。不指定小数点位数。

二:时间日期类型

几个需要注意的使用细节:

1. 注意表示的时间区间,各类型使用区别: 年月日(date 默认 NULL), 年月日时分秒(datetime 默认 NULL),时分秒(time 默认 NULL),经常插入当前时间(timestamp 默认 CURRENT_TIMESTAMP),

年份(year 默认 NULL).

2. datetime和timestamp区别:

(1)TIMESTAMP支持的时间范围较小,其取值范围从19700101080001到2038年的某个时间,而DATETIME是从1000-01-01 00:00:00到9999-12-31 23:59:59,范围更大。
(2)表中的第一个TIMESTAMP列自动设置为系统时间。 如果在一个TIMESTAMP列中插入NULL,则该列值将自动设置为当前的日期和时间。在插入或更新一行但不明确给TIMESTAMP列赋值时也会自动设置该列的值为当前的日期和时间,当插入的值超出取值范围时,MySQL认为该值溢出,使用“0000-00-00 00:00:00”进行填补。
(3)TIMESTAMP的插入和查询都受当地时区的影响,更能反应出实际的日期。而DATETIME则只能反应出插入时当地的时区,其他时区的人查看数据必然会有误差。
(4)TIMESTAMP的属性受MySQL版本和服务器SQLMode的影响很大,本章都是以MySQL5.0为例进行介绍,在不同的版本下可以参考相应的MySQL帮助文档。

 时间型总结:优先考虑TIMESTAMP

三:字符串类型

几个需要注意的使用细节:

. char 和 varchar: char是固定长度的字符串类型,达不到指定长度会在末尾补空格,这既是优点又是缺点,优点是这也意味着它的处理速度一般较快,但反过来,固定长度就意味着可能会浪费存储空间。varchar会额外使用1-2个字节保存字符的位数。char适合长度比较一只固定或者很短的情况。MyISAM和MEMORY引擎建议使用char,memory引擎把char和varchar同等对待,都当做char处理,而InnoDB建议使用varchar,因为它内部存储都是使用指向数据列值的头指针,所以char不一定就比varchar会处理的快,但char的存储浪费是肯定比不上varchar的。

.TEXT 和 BLOB: 一般用于较大文本的保存,两者最主要的差别,BLOB能保存二进制数据,比如图片,而TEXT只能保存字符信息。由于保存大文本,所以会引起一些性能问题,尤其是执行大量的删除操作后,建议定期用 optimize table 进行碎片清理。 可以使用合成的索引提高精确查询的性能,例如建表时多加一列用于保存大文本的散列值,如md5。模糊查询用前缀索引。

 字符型总结:数据长度一致并且固定,例如Hash值,或者数据很短,选择char,否则varchar。

MySQL学习笔记(二):MySQL数据类型汇总及选择参考的更多相关文章

  1. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  2. 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...

  3. MySQL数据库笔记二:数据类型及数据库操作

    三.MySQL数据库数据类型 MySQL数据库中支持多种数据类型:数值型.字符型.日期型 常用的数据类型: 1.整型 int:整形,存储整数 int(M):M表示预期值.与存储大小和数值的范围无关. ...

  4. python学习笔记(二):python数据类型

    上一篇博客写了python的入门和简单流程控制,这次写python的数据类型和各种数据类型的内置方法.一.数据类型是什么鬼?计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各 ...

  5. 吴裕雄--天生自然MySQL学习笔记:MySQL 运算符

    要介绍 MySQL 的运算符及运算符的优先级. MySQL 主要有以下几种运算符: 算术运算符 比较运算符 逻辑运算符 位运算符 算术运算符 MySQL 支持的算术运算符包括: 在除法运算和模运算中, ...

  6. 吴裕雄--天生自然MySQL学习笔记:MySQL 事务

    MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成 ...

  7. 吴裕雄--天生自然MySQL学习笔记:MySQL 安装

    所有平台的 MySQL 下载地址为: MySQL 下载:https://dev.mysql.com/downloads/mysql/ 注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足 ...

  8. 吴裕雄--天生自然MySQL学习笔记:MySQL 导入数据

    1.mysql 命令导入 使用 mysql 命令导入语法格式为: mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql) 实例: # mysql -uroot -p12 ...

  9. 吴裕雄--天生自然MySQL学习笔记:MySQL 处理重复数据

    有些 MySQL 数据表中可能存在重复的记录,有些情况允许重复数据的存在,但有时候我们也需要删除这些重复的数据. 防止表中出现重复数据 可以在 MySQL 数据表中设置指定的字段为 PRIMARY K ...

  10. 吴裕雄--天生自然MySQL学习笔记:MySQL 临时表

    MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间. MySQL临时表只在当前连接可见,如果使用PHP脚本来创建My ...

随机推荐

  1. JS添加类似C# string.Format方法

    String.prototype.format=function()   {     if(arguments.length==0) return this;     for(var s=this, ...

  2. Masonry 在swift下的使用

    Masonry在oc下使用很方便,但是在swift下,由于oc方法和property都可以使用.fuc的语法,swift下只有属性可以使用.property的语法,方法只能写成.func().因此在s ...

  3. SVG制作简单的图形

    圆形 circle <svg width="200" height="200" > <circle cx="100" cy ...

  4. Intellj IDEA光标为insert状态,无法删除内容

    以前用得是社区版的IDEA,今天装了14版本的,结果导入项目后,发现打开java文件的光标是win系统下按了insert键后的那种宽的光标,并且还无法删除内容,且按删除(delete)键也只见光标往前 ...

  5. Python基础-类变量和实例变量

    Python基础-类变量和实例变量 写在前面 如非特别说明,下文均基于Python3 大纲: 1. 类变量和实例变量 在Python Tutorial中对于类变量和实例变量是这样描述的: Genera ...

  6. Spring Web 配置文件加载路径问题

    Spring:   定位   载入   注册 我们常用的加载context文件的方法有如下三个: 1.FileSystemXmlApplicationContext 这个方法是从文件绝对路径加载配置文 ...

  7. jQuery(二) jQuery对Ajax的使用

    学习使我快乐!嘿 --WH 一.jQuery使用Ajax 想要了解jQuery如何使用Ajax,并且体会到它所带来的方便性,那么就得了解原始的Ajax是如何编写的,是怎样的繁琐,然后和Jquery的代 ...

  8. XMLHttpRequest函数封装

    XMLHttpRequest函数封装: function ajax(Url,sccuessFn,failureFn) { //1.创建XMLHttpRequest对象 var xhr = null; ...

  9. HTML5 Web SQL 数据库操作

    Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs. 以下是规范中定义的三个核心方法: openDataba ...

  10. 如何使用slice,substr代替substring(原创)

    //写这个是为了加深对substring和slice的理解 substring: 任何一个参数小于0,都会被替换成0.两个参数,最小值会被当做start,最大值当做end. 参数 描述 start 必 ...