六天带你玩转Mysql笔记--第二天
1. 数据类型(列类型)
1.1数值型
1.1.1整数型
1.1.2 小数型
1.2时间日期类型
1.3 字符串类型
1 .3.1 定长字符串(char)
1.3.2变长字符串varchar
1.3.3 文本字符串
1.3.4 枚举字符串
1.3.5 集合字符串
2. Mysql记录长度
3. 列属性
3.1 空属性
3.2列描述comment
3.3默认值
1. 数据类型(列类型)
(1)数据类型:对数据进行统一的分类,从系统的角度出发时为了能使用统一的方式进行管理,更好地利用有限的空间。
(2)SQL中将数据类型分成了三大类:数值类型,字符串类型和时间日期类型
1.1数值型
数值型数据:都是数据。
系统将数值型分为整数型和小数型。
1.1.1整数型
在SQL中药考虑如何节省磁盘空间,所以系统将整形细分为5类。
u Tinyint 迷你整形,使用1个字节存储,表示状态最多为256种。
u Smallint 小整形,使用2个字节存储,表示状态最多为65536种。
u Mediuint 中整形,使用3个字节存储。
u Int 标志整形,使用4个字节存储。
u Bigint 大整形,使用8个字节存储
(1)使用相应数据类型时,存储的值需在规定的范围内。
(2)SQL中的数值类型全部都是默认有符号:分正负
(3)每个字段数据类型之后括号中的数字代表的是显示宽度。
(4)显示宽度的意义:当数据显示宽度不够的时候,会自动让数据变成对应的显示宽度。通常需要搭配一个前导0来增加宽度,不改变值大小。Zerofill(零填充)会导致无符号数。
(5)零填充的意义(显示宽度):保证数据格式
1.1.2 小数型
小数型:带有小数点或者范围超出整形的数值类型
SQL中将小数型分为:浮点型和定点型
u 浮点型:小数点浮动,精度有限,而且会丢失精度。
Float:单精度,占用4个字节存储数据,精度范围大概7位左右。
Double:双精度,占用8个字节存储数据,精度范围大概为15为左右。
创建浮点数表:(1)直接float(表示没有小数部分)
(2)float(M,D) M代表总长度,D代表小数部分长度,整形长度 为(M-D)
(3)插入的数据可以是小数,也可以是科学计数法。
(4)整数部分 不能超出长度,小数部分可以。(4舍5入)
u 定点型:小数点固定,精度固定,不会丢失精度。
绝对保证整数部分和不会被四舍五入(不会丢失精度),小数部分有可能(理论小数部分也不会丢失精度)。
1.2时间日期类型
1.3 字符串类型
在SQL中,将字符串类型分成了6类:char,vachar,text,blob,enum和set。
1.3.1 定长字符串(char)
(1)在磁盘(二维表)中定义结构时,就确定了最终数据的存储长度。
(2)Char(L)
L代表存储长度,单位为字符,最大长度值为255。
Char[4]在utf8环境下,需要4*3=12个字节。
1.3.2变长字符串varchar
(1)在分配空间时,按照最大的空间分配。根据具体的数据来确定用多少空间。
(2)Varchar(L):L表示字符串长度,理论长度65536个字符,但是会多出1到2个字节来确定存储的实际长度。
(3)Varchar(10):若存了10个汉字,utf8环境下占用空间:10*3+1=31
定长与变长的存储实际空间(UTF8)
实际存储数据 | Char(4) | Varchar(4) | Char占用字节 | Varchar占用字节 |
ABCD | ABCD | ABCD | 4*3=12 | 4*3+1=13 |
A | A | A | 4*3=12 | 1*3+1=4 |
ABCDE | 不能存储 | 不能存储 | 数据超过长度 | 数据超过长度 |
如何选择定长或者变长字符串?
定长的磁盘空间比较浪费,但是效率高。如果数据长度基本一样,就使用定长,如身份证,手机号码,电话号码等。
变长的磁盘空间比较节省,但是效率低。如果不同数据长度有变化,如姓名,地址。
1.3.3 文本字符串
如果数据量非常大(超过255)就会使用文本字符串。文本字符串根据储存的数据格式进行分类:text和blob
Text:储存文字(二进制数据实际上都是只存数据的储存路径)
Blob:储存二进制数据(通常不用)
1.3.4 枚举字符串
(1)枚举(enum):事先将所有可能出现的结果都设计好,实际上储存的数据必须是规定好的数据中的一个。
(2)枚举的定义:enum(可能出现的元素列表);
(3)枚举作用
作用1:规范数据格式,数据只能是规定的数据中的一个。
作用2:节省储存空间(枚举别名:单选框)。在mysql中,系统自动转换数据格式。
(4)枚举原理:枚举在进行数据规范的时候(定义的时候),系统自动建立一个数字与枚举元素的对应关系(关系放到日志中)。
在进行数据插入的时候,系统自动将字符转成对应的数字存储。
在进行数据提取的时候,系统自动将数值转换成对应的字符串显示。
(5)枚举存储的是数值(1,2.....),故可直接插入数值。
1.3.5 集合字符串
(1)集合跟枚举相似,实际存储的是数值,而不是字符串(集合是多选)
(2)集合的使用方式
定义:set(元素列表)
使用:可以使用元素列表中的元素,使用逗号分隔。
(3) 集合中每一个元素都是对应一个二进制位,被选中为1,没有则为0.
2. Mysql记录长度
(1)Mysql规定:任何一条记录最长不能超过65535个字节(varchar永远达不到理论值)。
(2)Utf8下的varchar的实际顶配:21844(21844*3+2=65534)字符
(3)Gbk下的varchar的实际顶配:32766(32766*2+2=65534)字符
(4)Mysql记录中,如果有任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储NULL(若想释放Null所占用的字节,必须保证所有的字符都不允许为空)。
(5)Mysql中text文本字符串,不占用记录长度(额外存储),但是text文本字符串也是属于记录的一部分,一定需要占用记录中的部分长度(10个字符串)。
3. 列属性
(1)真正约束自动的是数据类型,但是数据类型的约束很单一,需要有一些额外的约束来保证数据的合法性。
(2)列属性:NULL/NOT NULL,default,primary,unique key,auto_increment,comment。
3.1 空属性
两个值NULL(默认的)和NOT NULL(不为空)。
虽然默认为空,但是实际开发中,尽可能让数据不为空。
3.2列描述comment
没有实际含义,专门用来描述字段,会根据表创建语句保存。用来给程序员(数据库管理员)来进行了解的。
3.3默认值
某一种数据经常性出现某个具体的值,可以在一开始就指定。在需要的真是数据时,用户可以选择性的使用默认值。