mysql使用笔记(四)
一、选择合适的数据类型
1. CHAR vs VCHAR
char是固定长度的字符类型,而varchar是可变长度的字符类型。char(M)的数据列中,每个值都占用M个字节,如果某个长度小于M,mysql就会在它的右边用空格字符补足,在检索操作的时候最后一个非空格字符右边的所有字符都会被去掉,因此需要注意,去掉右边的空格有可能不只去掉补足的空格,还有可能去掉原来字符串中右边已有的空格!
在varchar(M)的数据列中,每个值只占用刚好够用的字节数再加上一个用来记录其长度的字节(即总长度为L+1个字节)。
由于char固定长度,因此处理速度比vchar快,但是占用空间比vchar大,在使用的时候需要具体情况具体分析,一般的原则是:
(1)对于myisam表,尽量使用char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此;
(2)对于innodb表,尽量使用varchar。
2. TEXT vs BLOB
保存少量字符串时使用char或varchar,而保存较大的文本时,选择text或者blob。二者的区别是blob还可以保存二进制数据,比如图片;而text只能保存纯文本数据。text和blob又分别细分为text,mediumtext,longtext和blob,mediumblob,longblob三种不同的长度类型。
blob和text值会引起一些性能问题,特别是在执行了大量的删除操作时。
删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上会有影响。为了提高性能,建议定期使用 optimize table功能对这类表进行碎片整理,避免因为“空洞”导致性能问题。
可以使用合成的索引来提高大文本字段(blob或者text)的查询性能。合成索引就是根据大文本字段的内容建立一个散列值,并把这个值存储在单独的数据列中,接下来就可以根据检索散列值找到数据行。但是,这种技术只能用于精确匹配的查询(散列值对于类似<, >, >= 等范围搜索没有用)。
可以使用MD5(),SHA1(),CRC32()等来生成散列值。比如
create table t(id varchar(100), context blob, hash_value varchar(40));
insert into t values(1, repeate('beijing',2), md5(context)),
(2, repeate('beijing',200), md5(context)),
(100, repeate('helloworld',20), md5(context));
select * from t where hash_value=md5(repeat('beijing', 2));
如果需要对blob或text字段进行模糊匹配,mysql提供了前缀索引,即前缀%,比如select * from t where context='hello%'
。
3. 浮点数 vs 定点数
(1)浮点数存在表示误差,定点数采用字符串进行存储,精度高
(2)对货币等精度敏感的数据,应该采用定点数进行存储
(3)编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较
(4)要注意浮点数中一些特殊值的处理
4. 日期类型选择
(1)要根据实际需要选择能够满足应用的最小存储的日期类型。比如,如果仅需要记录年份,则用1个字节来存储的YEAR,而不用考虑4个字节的DATE
(2)如果要记录日期和时间,且记录的年份久远,最好使用DATETIME而不是TIMESTAMP,因为DATETIME的范围比TIMESTAMP广
(3)如果记录的日期需要让不同时区的用户使用,最好使用TIMESTAMP,因为TIMESTAMP和实际时区匹配
二、 mysql中的字符集
常用字符集比较:
字符集 | 是否定长 | 编码方式 | 其他说明 |
---|---|---|---|
ASCII | 是 | 单字节7位编码 | 最早的奠基性字符 |
IOS-8859-1/latin1 | 是 | 单字节8位编码 | 西欧字符集 |
GB2312 | 是 | 双字节编码 | 早期标准,不推荐使用 |
GBK | 是 | 双字节编码 | 不少系统支持 |
GB18030 | 否 | 2字节或4字节编码 | 开始有一些支持,但数据库不常见 |
UTF-32 | 是 | 四字节编码 | UCS-4原始编码,现在很少使用 |
UCS-2 | 是 | 2字节编码 | |
UTF-16 | 否 | 2字节或4字节编码 | java和windows xp/nt等内部使用 |
UTF-8 | 否 | 1~4字节编码 | 互联网和unix/linux广泛支持的unicode字符集 |
其中,GBK每个汉字占用2个字节,而UTF-8每个汉字占用3个字节。
mysql使用笔记(四)的更多相关文章
- MySql学习笔记四
MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...
- MySQL学习笔记四:字符集
1.字符集就是字符和其编码的集合,查看数据库支持的字符集 show character set 2.查看服务端启动时默认的字符集 mysql> show variables like 'char ...
- MySQL学习笔记(四)—存储过程
一.概述 存储过程是数据库定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程可以避免开发人员重复的编写相同的SQL语句,而且存储过程是在MySq ...
- MySQL学习笔记(四):存储引擎的选择
一:几种常用存储引擎汇总表 二:如何选择 一句话:除非需要InnoDB 不具备的特性,并且没有其他办法替代,否则都应该优先考虑InnoDB:或者,不需要InnoDB的特性,并且其他的引擎更加合适当前情 ...
- mysql学习笔记四 —— AB复制
要点:ab复制 mysql集群架构流程: ABB(主从复制)-->MHA(实现mysql高可用.读写分离.脚本控制vip飘逸)-->haproxy(对slave集群实现分发,负载均衡)-- ...
- MySQL数据库笔记四:MySQL的约束
<1>概念 是一种限制,它是对表的行和列的数据做出约束,确保表中的数据的完整性和唯一性. <2>使用场景 创建表的时候,添加约束 <3>分类 1. default: ...
- MySql学习笔记(四) —— 数据的分组
前面介绍的聚集函数只是用来计算行数,平均数,最大值,最小值而不用检索所有数据.通过count()函数,我们可以计算生产商1003提供的产品数目,但如果我要查询所有生产商提供的商品数,这就需要进行分组查 ...
- openresty 学习笔记四:连接mysql和进行相关操作
openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...
- MYSQL基础笔记(四)-数据基本操作
数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...
- Mysql学习笔记(三)对表数据的增删改查。
正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...
随机推荐
- Sublime Text shift+ctrl妙用、Sublime Text快捷组合键大全
Package Control 安装方法 首先通过快捷键 ctrl+` 或者 View > Show Console 打开控制台,然后粘贴相应的 Python 安装代码. 1 :按住shift+ ...
- spring注入参数详解
spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...
- ZENG msgbox仿qq提示
ZENG.msgbox.show("设置成功!", 4, 2000); ZENG.msgbox.show("服务器繁忙,请稍后再试.", 1, 2000); Z ...
- Java中的的XML文件读写
XML简介 要理解XML,HTML等格式,先来理解文档对象模型DOM 根据 DOM,HTML 文档中的每个成分都是一个节点,这些节点组成了一棵树.DOM 是这样规定的:整个文档是一个文档节点每个 HT ...
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
- iOS深入学习:(UITableView系列3:insertRow)
前面一篇博客,我使用了reloadData来刷新界面,但是这样没有动画效果,那么我这里通过insertRowsAtIndexPaths:withRowAnimation设置动画效果,希望对大家有所帮助 ...
- UVA 11404 五 Palindromic Subsequence
Palindromic Subsequence Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu ...
- 3d中的向量
向量基础知识 向量有且仅有的两个属性:方向长度(注意:向量性情中不包含位置信息) 向量相等就是其两个属性相等 向量处理标记位置:当向量的起始点与坐标原点重合,这样我们就可以用向量的终点坐标来描述一个处 ...
- Java_一些特殊的关键字详(?)解
1. native. 在看JDK源码时,想知道Math包里比如cos, sin等函数是如何实现的(猜想的是用他们在0点的泰勒展开式近似),但是打开之后却发现只有一个函数声明,并且有关键字native, ...
- Change An Item Property Using Set_Item_Property In Oracle Forms
Set_Item_Property is used to change an object's settings at run time. Note that in some cases you ca ...