数据库之存储引擎,数据类型-30
生活随笔
收集整理的这篇文章主要介绍了
数据库之存储引擎,数据类型-30
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
数据库之存储引擎,数据类型-30 数据存储引擎 什么是引擎 ? 一个功能的核心部分 引擎可以被分类 为什么要分类? 自然 增压的 汽油 柴油 电动 混合动力 天然气 核动力 烧水 汽油 动力弱一点 噪音小 震动小 柴油 动力强 污染大 噪音大 振动大 需求场景的不同催生了不同的引擎类别 回到mysql 核心功能是存储数据 涉及到存储数据的代码 就称之为存储引擎 根据不同的需求 也有着不同的引擎分类 egon博客上写的如下解释: 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方 法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎 命令:show engines;可以查看所有的数据库引擎。 =========================================================== 关于引擎的介绍: #InnoDB 存储引擎支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其 特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。 InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。 InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。 对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。 InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。 #MyISAM 存储引擎不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。#NDB 存储引擎 2003 年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。 #Memory 存储引擎正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。 #Infobright 存储引擎 第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。 #NTSE 存储引擎网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。 #BLACKHOLE黑洞存储引擎,可以应用于主备复制中的分发主库。 MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅力所在。 =========================================================== 可以看到,在配置文件里已经指定了默认的存储引擎。 不同的引擎测试: 创建表时在最后指定引擎名称 engine = xxx create table t1(id int)engine=innodb create table t1(id int not null)engine=csv create table t1(id int)engine=memory create table t1(id int)engine=blackhole insert into t1 value(1); insert into t2 value(1); insert into t3 value(1); insert into t4 value(1); 总结: innodb是默认的引擎 因为 它是永久存储 并且 支持事务,行锁,外键 非锁定读(默认读取操作不会产生锁) 创建表的完整语法 create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); 注意注意注意:表中的最后一个字段不要加逗号 #注意:1. 在同一张表中,字段名是不能相同 2. 宽度和约束条件可选 3. 字段名和类型是必须的 长度用于设置数据的长度 数据类型也是一种约束 约束指的是除了数据类型外的额外的规范 如果添加的数据超过了指定的长度范围,超出范围的就丢弃; 注意: 字段名 和 表名 库名 都不能是mysql的关键字 比如select from not..... ***** 例子: mysql> create database db1 charset utf8; mysq> use db1; mysq> create table t1( -> id int, -> name varchar(50), -> sex enum('male','female'), -> age int(3) -> ); mysq> show tables; #查看db1库下所有表名 命令(desc 表名;)|| (show columns from 表名;):获取表结构 desc是describe的缩写 mysq> select id,name,sex,age from t1; Empty set (0.00 sec) 往表里只插入一列id数据:
数据类型之整数型 数据类型 为什么需要将数据分类? 1.为了描述事物 更加准确 2.描述起来更方便 3.节省内存空间 1 a 你 utf8 下 5个字节 1 a b c unicode 6个字节 mysql支持的数据类型: 整型 *** *** *** ***** *** tinyint smallint mediumint int bigint 字节数: 1 2 3 4 8 默认情况下整型是有符号的 需要用一个二进制位存储符号 给整型加上 约束 unsigned来表示无符号 如果数据超出范围就尽可能保存最大的 例如 在无符号下 保存256 其实存的255 如果有符号 例如 tinyint 保存-1280 其实存的是-128 是最小值 ======================================== tinyint[(m)] [unsigned] [zerofill] m为显示的长度,不写默认为3。 小整数(一个字节,也就是8个比特位),数据类型用于保存一些范围的整数 数值范围: 有符号: -128 ~ 127 无符号: 0 ~ 255 PS: MySQL中无布尔值,使用tinyint(1)构造。 ======================================== int[(m)][unsigned][zerofill] m为显示的长度,不写默认为10。 整数(4个字节,也就是32个比特位),数据类型用于保存一些范围的整数 数值范围: 有符号: -2147483648 ~ 2147483647 无符号: 0 ~ 4294967295(2 ** 32 -1) ======================================== bigint[(m)][unsigned][zerofill] 大整数,数据类型用于保存一些范围的整数 数值范围: 有符号: -9223372036854775808 ~ 9223372036854775807 无符号: 0 ~ 18446744073709551615 修改严格模式: 以上特性的出现是因为 mysql处于非严格模式 查看当前模式 show variables like "sql_mode"; 修改为严格模式 set global sql_mode = "STRICT_TRANS_TABLES"; 严格模式下 如果值超出范围就直接报错,在一些版本中默认就是严格模式! 在我们的正常开发中,我们应该先判断数据的正确性,没有问题在发给数据库 怎么选择: 得根据实际情况来判断,能够保存你的数据的最小类型 长度限制对于整型的意义: create table t10(id int(1)); insert into t10 value(454555); select *from t10; 发现这个数也存储成功 说明 这里长度指的不是存储容量限制 而是显示的宽度 如果你的数据超过了显示宽度 有几个显示几个 如果不足 则补全到指定长度 得告诉它用什么来补全 create table t13(id int(10) zerofill);(zerofill用零补) 总结 : 这个10,不是容量限制 而是 显示宽度 要限制显示宽度 1.创建表时 给整型加上宽度 2.加上zerofill约束
数据类型之浮点型 浮点型: 小数型 分类: float ***** double **** decimal ***** 字节数: 4 8 不确定(手动指定) 给浮点设置宽度限制 float(m,d) #m的最大值为255,d的最大值为30,精度最小 double(m,d) #m的最大值为255,d的最大值为30,精度中等 decimal(m,d) #m的最大值为65,d的最大值为30,精度最高 长度说明 ***** m表示 这个浮点数整体的长度 d表示 小数部分的长度 例如: float(5,3) 最大值: 99.999 区别 ***** 相同点: 小数部分最大长度都是30 float和double的最大长度为255 不同点: decimal的整体最大长度65 精度不同 double 比 float 精度高 decimal 是准确的 不会丢失精度 如何选择:你对精确度要求高你就使用 decimal 例子: 可以看到float的精度几乎只有double的一半,decimal的精度最高,一点都没有出错。
数据类型之时间类型 分类 time 时分秒 HH:MM:SS *** year 年份 *** date 日期 年月日 *** datetime 日期加时间 年月日 时分秒 年份最大是9999 ***** timestamp 时间戳 从1970-1-1开始算 年份最大是2037 ***** TIME HH:MM:SS('-838:59:59'/'838:59:59') YEAR YYYY(1901/2155) DATE YYYY-MM-DD(1000-01-01/9999-12-31) DATETIME YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 ) TIMESTAMP YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时) 共同点: 时间的存取通过字符串类型 都可以使用now()函数来插入当前时间 datetime不写now()方法时,默认插入为空 datetime 和 时间戳都能够表示日期和时间 不同之处是: 年份最大范围不同 时间戳可以为空 代表当前时间,如图: 时间戳在你更新记录时 会自动更新为当前时间,如图: 在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。 ============注意啦,注意啦,注意啦=========== 1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入 2. 插入年份时,尽量使用4位值 3. 插入两位年份时, <=69,以20开头,比如50, 结果2050 >=70,以19开头,比如71,结果1971 MariaDB [db1]> create table t12(y year); MariaDB [db1]> insert into t12 values -> (50), -> (71); MariaDB [db1]> select * from t12; +--------+ | y | +--------+ | 2050 | | 1971 | +---------+
数据类型之字符型 字符型 分类 char 定长字符 varchar 变长字符 char类型的长度是固定 无论你存储的数据有多长 占用的容量都一样 char(3) 存储的数据为 "a" 在硬盘保存的数据还是占3字符长度 实际保存的是"a " 如果是char类型 如果你的数据不足指定长度 就在后面用空格补全 varchar 长度是可变的 存储的数据有多长就占用多长 varchar(3) 存储的数据为 "a" 在硬盘保存的数据还是占1字符长度 实际保存的是"a" yxx exx lxx zxx cx wxx char(3) 因为是可变长度,就有一个问题,不知道数据从哪里开始到哪里结束,所以需要有一个位置保存数据的长度 如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255) 如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535) 验证: 使用一个 char_length的函数 可以查看字符的长度 create table t18(a char(4),b varchar(4)); insert into t18 value("x","x"); select char_length(a),char_length(b) from t18; #char_length()方法可以获取数据库内,字符的长度。 两个字段的长度都为1 结论: 这是因为 mysql在存储时 自动加上的空格 对使用者而言是没有意义的 所以mysql自动帮你处理掉空格了 我们可以设置sql模式 来让它现出原形 set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES" 设置完成后重启msyql 再次查询长度 注意: 当你在执行这样的查询语句时 mysql会自动将参数末尾的空格去除 select * from t19 where name = "yh" 当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 % select *from t19 where name like "yh"; % 任意个数的任意字符 _ 1个任意字符 如何选择 char 存取效率高 浪费存储空间 varchar 存取效率低于char 节省存储空间 使用起来感受不到区别 通常用的是char ====================================== char 和varchar的比较 #char类型:定长,简单粗暴,浪费空间,存取速度快字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节) 存储: 存储char类型的值时,会往右填充空格来满足长度 例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储 检索: 在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)#varchar类型:变长,精准,节省空间,存取速度慢字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html) 存储: varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来 强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用) 如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255) 如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535) 检索: 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容 =========================================================== =========================================================== 大文本类型: TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT 文本是带有编码 BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB 也是字符数据 但是不带编码 二进制类型: 用于存储多媒体数据 比如视频 但是我们一般不会将多媒体数据存到数据 而是存储文件路径地址 BINARY系列 BINARY VARBINARY 存储二进制数据
数据类型之枚举和集合 枚举 ** 用于描述 一个已知范围的数据 例如性别: 只有男 女 或其他 enum("man","woman","other") 总结: 枚举中只能是字符串类型 添加的数据只能是已经出现在枚举中的值 你的值只能是其中的一个 你也可以使用枚举值的序号来插入值 从1开始 集合 用于描述一堆数据 比如你的兴趣爱好 set("watch movie","listen music","play game") 总结:集合中的数据 只能是字符串 添加的数据只能是已经出现在集合中的值 你的值可以是其中的任意一个或多个 你也可以使用枚举值的序号来插入值 从1开始 但是只能给一个序号 posted on 2018-12-27 09:28 漫天飞雪世情难却 阅读(...) 评论(...) 编辑 收藏
数据类型之整数型 数据类型 为什么需要将数据分类? 1.为了描述事物 更加准确 2.描述起来更方便 3.节省内存空间 1 a 你 utf8 下 5个字节 1 a b c unicode 6个字节 mysql支持的数据类型: 整型 *** *** *** ***** *** tinyint smallint mediumint int bigint 字节数: 1 2 3 4 8 默认情况下整型是有符号的 需要用一个二进制位存储符号 给整型加上 约束 unsigned来表示无符号 如果数据超出范围就尽可能保存最大的 例如 在无符号下 保存256 其实存的255 如果有符号 例如 tinyint 保存-1280 其实存的是-128 是最小值 ======================================== tinyint[(m)] [unsigned] [zerofill] m为显示的长度,不写默认为3。 小整数(一个字节,也就是8个比特位),数据类型用于保存一些范围的整数 数值范围: 有符号: -128 ~ 127 无符号: 0 ~ 255 PS: MySQL中无布尔值,使用tinyint(1)构造。 ======================================== int[(m)][unsigned][zerofill] m为显示的长度,不写默认为10。 整数(4个字节,也就是32个比特位),数据类型用于保存一些范围的整数 数值范围: 有符号: -2147483648 ~ 2147483647 无符号: 0 ~ 4294967295(2 ** 32 -1) ======================================== bigint[(m)][unsigned][zerofill] 大整数,数据类型用于保存一些范围的整数 数值范围: 有符号: -9223372036854775808 ~ 9223372036854775807 无符号: 0 ~ 18446744073709551615 修改严格模式: 以上特性的出现是因为 mysql处于非严格模式 查看当前模式 show variables like "sql_mode"; 修改为严格模式 set global sql_mode = "STRICT_TRANS_TABLES"; 严格模式下 如果值超出范围就直接报错,在一些版本中默认就是严格模式! 在我们的正常开发中,我们应该先判断数据的正确性,没有问题在发给数据库 怎么选择: 得根据实际情况来判断,能够保存你的数据的最小类型 长度限制对于整型的意义: create table t10(id int(1)); insert into t10 value(454555); select *from t10; 发现这个数也存储成功 说明 这里长度指的不是存储容量限制 而是显示的宽度 如果你的数据超过了显示宽度 有几个显示几个 如果不足 则补全到指定长度 得告诉它用什么来补全 create table t13(id int(10) zerofill);(zerofill用零补) 总结 : 这个10,不是容量限制 而是 显示宽度 要限制显示宽度 1.创建表时 给整型加上宽度 2.加上zerofill约束
数据类型之浮点型 浮点型: 小数型 分类: float ***** double **** decimal ***** 字节数: 4 8 不确定(手动指定) 给浮点设置宽度限制 float(m,d) #m的最大值为255,d的最大值为30,精度最小 double(m,d) #m的最大值为255,d的最大值为30,精度中等 decimal(m,d) #m的最大值为65,d的最大值为30,精度最高 长度说明 ***** m表示 这个浮点数整体的长度 d表示 小数部分的长度 例如: float(5,3) 最大值: 99.999 区别 ***** 相同点: 小数部分最大长度都是30 float和double的最大长度为255 不同点: decimal的整体最大长度65 精度不同 double 比 float 精度高 decimal 是准确的 不会丢失精度 如何选择:你对精确度要求高你就使用 decimal 例子: 可以看到float的精度几乎只有double的一半,decimal的精度最高,一点都没有出错。
数据类型之时间类型 分类 time 时分秒 HH:MM:SS *** year 年份 *** date 日期 年月日 *** datetime 日期加时间 年月日 时分秒 年份最大是9999 ***** timestamp 时间戳 从1970-1-1开始算 年份最大是2037 ***** TIME HH:MM:SS('-838:59:59'/'838:59:59') YEAR YYYY(1901/2155) DATE YYYY-MM-DD(1000-01-01/9999-12-31) DATETIME YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 ) TIMESTAMP YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时) 共同点: 时间的存取通过字符串类型 都可以使用now()函数来插入当前时间 datetime不写now()方法时,默认插入为空 datetime 和 时间戳都能够表示日期和时间 不同之处是: 年份最大范围不同 时间戳可以为空 代表当前时间,如图: 时间戳在你更新记录时 会自动更新为当前时间,如图: 在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。 1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,操作系统以及客户端连接都有时区的设置。 3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。 4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。 ============注意啦,注意啦,注意啦=========== 1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入 2. 插入年份时,尽量使用4位值 3. 插入两位年份时, <=69,以20开头,比如50, 结果2050 >=70,以19开头,比如71,结果1971 MariaDB [db1]> create table t12(y year); MariaDB [db1]> insert into t12 values -> (50), -> (71); MariaDB [db1]> select * from t12; +--------+ | y | +--------+ | 2050 | | 1971 | +---------+
数据类型之字符型 字符型 分类 char 定长字符 varchar 变长字符 char类型的长度是固定 无论你存储的数据有多长 占用的容量都一样 char(3) 存储的数据为 "a" 在硬盘保存的数据还是占3字符长度 实际保存的是"a " 如果是char类型 如果你的数据不足指定长度 就在后面用空格补全 varchar 长度是可变的 存储的数据有多长就占用多长 varchar(3) 存储的数据为 "a" 在硬盘保存的数据还是占1字符长度 实际保存的是"a" yxx exx lxx zxx cx wxx char(3) 因为是可变长度,就有一个问题,不知道数据从哪里开始到哪里结束,所以需要有一个位置保存数据的长度 如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255) 如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535) 验证: 使用一个 char_length的函数 可以查看字符的长度 create table t18(a char(4),b varchar(4)); insert into t18 value("x","x"); select char_length(a),char_length(b) from t18; #char_length()方法可以获取数据库内,字符的长度。 两个字段的长度都为1 结论: 这是因为 mysql在存储时 自动加上的空格 对使用者而言是没有意义的 所以mysql自动帮你处理掉空格了 我们可以设置sql模式 来让它现出原形 set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES" 设置完成后重启msyql 再次查询长度 注意: 当你在执行这样的查询语句时 mysql会自动将参数末尾的空格去除 select * from t19 where name = "yh" 当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 % select *from t19 where name like "yh"; % 任意个数的任意字符 _ 1个任意字符 如何选择 char 存取效率高 浪费存储空间 varchar 存取效率低于char 节省存储空间 使用起来感受不到区别 通常用的是char ====================================== char 和varchar的比较 #char类型:定长,简单粗暴,浪费空间,存取速度快字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节) 存储: 存储char类型的值时,会往右填充空格来满足长度 例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储 检索: 在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)#varchar类型:变长,精准,节省空间,存取速度慢字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html) 存储: varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来 强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用) 如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255) 如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535) 检索: 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容 =========================================================== =========================================================== 大文本类型: TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT 文本是带有编码 BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB 也是字符数据 但是不带编码 二进制类型: 用于存储多媒体数据 比如视频 但是我们一般不会将多媒体数据存到数据 而是存储文件路径地址 BINARY系列 BINARY VARBINARY 存储二进制数据
数据类型之枚举和集合 枚举 ** 用于描述 一个已知范围的数据 例如性别: 只有男 女 或其他 enum("man","woman","other") 总结: 枚举中只能是字符串类型 添加的数据只能是已经出现在枚举中的值 你的值只能是其中的一个 你也可以使用枚举值的序号来插入值 从1开始 集合 用于描述一堆数据 比如你的兴趣爱好 set("watch movie","listen music","play game") 总结:集合中的数据 只能是字符串 添加的数据只能是已经出现在集合中的值 你的值可以是其中的任意一个或多个 你也可以使用枚举值的序号来插入值 从1开始 但是只能给一个序号 posted on 2018-12-27 09:28 漫天飞雪世情难却 阅读(...) 评论(...) 编辑 收藏
转载于:https://www.cnblogs.com/jokezl/articles/10183133.html
总结
以上是生活随笔为你收集整理的数据库之存储引擎,数据类型-30的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: MYSQL 5.6安装设置中英文翻译
- 下一篇: mysql 和 sqlserver中备份