在数据库中数据表用来组织和保存各种数据它是由表结构和数据构成的在设计表结构时经常需要根据实际需求选择合适的数据类型与约束数字类型整数类型MySQL中的整数类型用于保存整数根据取值范围不同选择的整数类型不同类型字节数有符号范围 (Signed)无符号范围 (Unsigned)TINYINT1-128 〜 1270 〜 255SMALLINT2-32,768 〜 32,7670 〜 65,535MEDIUMINT3-8,388,608 〜 8,388,6070 〜 16,777,215INT4-2.1e9 〜 2.1e90 〜 4.2e9BIGINT8-9.22e18 〜 9.22e180 〜 1.84e19不同的整数类型占用字节数和取值范围不同如果需要使用无符号数据类型需要在数据类型右边加上UNSIGNED关键字。zerofill零填充首先来讲讲显示宽度显示宽度是专门为数据类型创建的格式显示规则显示宽度不影响你存储的数值它并不是取值范围MySQL的每一个整数类型都有其默认的显示宽度tinyint的显示宽度为4int的显示宽度为11数据类型占用字节默认显示宽度TINYINT14SMALLINT26MEDIUMINT39INT / INTEGER411BIGINT820对于有符号类型符号也占用一个宽度比如unsigned int的宽度为10显示宽度需要配合zerofill使用如果你为字段设置了零填充若数值宽度小于显示宽度则会在数值左侧填充0如果数值超过显示宽度则不会填充0。注意设置零填充后字段自动设为无符号类型。浮点数在MySQL中小数都是通过浮点数或者定点数来表示的浮点数分为float单精度和double双精度两种。数据类型占用字节有效精度十进制取值范围有符号FLOAT4 字节约 6~7 位±1.175494351E-38 ~ ±3.402823466E38DOUBLE8 字节约 15~16 位±2.2250738585072014E-308 ~ ±1.7976931348623157E308浮点数虽然取值范围很大但是精度并不高。float的精度为6位或7位double的精度为15位超出精度会导致给定的数值与实际保存的数值不一致四舍五入。定点数定点数类型通过decimalMD设置位数和精度M表示数字总位数默认值为10D表示小数点后面的位数最大值为30默认值为0.例如decimal52的取值范围就是-999.99-999.99系统会自动根据存储的数据来分配存储空间。如果小数部分超出范围会进行四舍五入如果整数部分超出范围数据会插入失败。Bit类型BIT(M)用于存储二进制数据M表示位数范围为1-64.插入方法:INSERT INTO my_bit VALUES (b101)INSERT INTO my_bit VALUES (5)这里二进制数b101(在二进制字符串前加前缀b)和十进制数5等价。查询方法客户端默认不显示数字而是十六进制如果想要查看二进制结果可以使用bin(M)手动转换如果想要查看十进制结果可以使用M0手动转换时间与日期类型为了方便在数据库中存储日期MySQL提供了表示日期和时间的数据类型。常用的有year、date、time、datatime、timestampyear表示年份格式为“YYYY”data表示日期格式为“YYYYMMDD”time表示时间值格式为“HHMMSS”datetime:表示日期和时间格式为“YYYY-MM-DD HHMMSS”timestamp表示时间戳记录某条数据的创建时间、修改时间。查看当前时间可以用select now();timestamp如果你把timestamp设置为DEFAULT CURRENT_TIMESTAMP那么它就会记录下当前的日期与时间。create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP如果你把timestamp设置为DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP那么它就会记录下每次表结构更新update的时间insert插入数据时不记录。update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPtimestamp和datatime虽然显示结构一样但是timestamp一般用于记录操作的发生时刻比如用户登录、操作记录、访问时间而datatime用于存储固定时间比如说公告发布时间、入职时间字符串类型CAHR固定长度字符串VARCHAR可变长度字符串TEXT大文本数据ENUM枚举类型SET字符串对象BINARY固定长度的二进制数据VARBINARY可变长度的二进制数据BLOB二进制大对象char和varchar类型charMvarcharM这是char和varchar类型的定义方式M指的是字符串的最大长度。插入值char(4)存储需求varchar(4)存储需求‘’4字节1字节‘ab4字节3字节abc4字节4字节abcd4字节5字节对于char(4)而言无论插入值的长度是多少所占用的存储空间都是4字节而varchar(4)占用的字节数是实际长度1。MySQL中的字节数和C里的字节数不同C里面一个字符可能对应多个字节比如中文字符但是MySQL中一个字符就相当于一个字节。text类型text类型用于保存非查询大文本数据比如评论、文章等比较长的文本text类型只能创建前缀索引只能索引前 N 个字符无法创建全列普通索引、唯一索引。类型名称最大存储字节数TINYTEXT255 字节TEXT65535 字节64KBMEDIUMTEXT16777215 字节16MBLONGTEXT4294967295 字节4GBENUM类型enum类型就是枚举类型定义方式为enum (值1,值2,...);enum类型的数据只能从枚举列表中选取而且只能选一个。枚举列表最多可以有65535个值每个值都有一个顺序编号实际上保存在记录中的是顺序编号而不是列表中的值因此不用担心过长的值占用空间。SET类型set类型用于保存字符串对象set(值1,值2...)set类型和enum类型区别在于set类型可以从列表中一个或多个来保存多个值之间用“ , ”相隔。create table my_set(hobby set(book,game,code)); insert into my_set values(), (book), (book,code);set和enum类型的优势在于规范数据本身限定只能插入规定的数据项节省存储空间查询数据比char、varchar更快。binary和varbinary类型binary和varbinary类似于char和varchar但不同的是他们表示二进制数据。定义方式如下binary(M)varbinary(M)M指的是二进制数据最大字节长度binary类型长度是固定的如果数据不足最大长度将在数据后面用“\0”补齐以达到指定长度比如数据类型为binary3当插入a时实际存储的数据为“a\0\0”。在查询binary类型时查询条件字符串也需要加上\0填充。并且binary和varbinary都区分大小写。BLOB类型BLOB类型用于存储数据量很大的二进制数据比如图片、pdf文档等等BLOB类型和TEXT类型很相似但是BLOB类型数据是根据二进制编码进行比较和排序而TEXT类型数据是根据文本模式进行比较和排序json类型JSON是一种轻量级的数据交换格式由JavaScript发展而来本质上是一个字符串。MySQL中的JSON类型有两种JSON数组和JSON对象。#json数组 [abc,10,null,true] #json对象 {“k1:value,k2:10} ​JSON数组中保存的数据可以是任意类型JSON数组使用 [ 和 ] 实现多个值之间用逗号分隔JSON对象使用 { 和 } 实现保存的数据时一组键值对。与直接使用MySQL字符串相比JSON数据类型具有自动验证格式、优化存储格式的优点。注意事项char和varchar类型在插入数据时。若字符串末尾有空格char类型会自动去掉空格保存而varchar、text类型会保留空格。在默认情况下创建的数据库和表使用的校对集对大小写不敏感因此char、varchar、text、enum、set类型都不区分大小写例如使用where查询’a字符串那么a和A都会被查询出来而binary、varbinary、blob类型区分大小写因为它们以二进制方式保存数据。从执行效率来说text和blob不如char和varchar建议只有当需要保存大量文本时才使用text或blob类型。