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 ...
随机推荐
- python中字符串\r的奇怪问题
示例: 我这里有一字符串: u'北京市工商行政管理局大兴分局\r <a onclick="showJDS(\'fa641bb3be5b44a1b618433833982fee\',\' ...
- httpclient4.3.6/httpcore-4.4自己封装的工具类
引入jar包 httpclient4.3.6/httpcore-4.4 package com.develop.util; import java.io.IOException; import jav ...
- WPF中父子窗口的层次关系
关于子窗体的层级关系总结一下哈,希望能对大家有些帮助 假设有这样两个窗体:RootWindow,SubWindow,在RootWindow中引发某事件而显示SubWindow 1,如果弹出窗体(比如S ...
- java反编译工具JD-GUI
这款java反编译工具是由C++写的,是一款免费的非商业用途的软件,(Xjad也不错,但是不支持jar反编译) 一.支持众多.class反编译工具 二.支持反编译jar
- 国内下Android源码地址
1 Android 4.4 with kernel: http://pan.baidu.com/s/1bnuDtHt 下载后,请务必阅读 必读.txt 2 android 5.0源码下载 http:/ ...
- Java动态代理 cglib
代理模式:为某些对象提供代理以实现对这个对象的访问. 对一个对象进行访问控制的原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化. 一般包括以下组件: 被代理者接口:提供被代理者的访问途径. ...
- Berkeley DB的常见API简单分析
1.用来存储类信息的数据库不要求能够存储重复的关键字 例: dbConfig.setSortedDuplicates(false);2.DatabaseEntrt能够支持任何能够转化为by ...
- servlet&jsp高级:第五部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Web项目中创建简单的错误处理页面
当应用程序出现错误的时候,如果没有做错误页面处理的话,会直接输出一些敏感的信息出来,有时候甚至会直接将项目所在的物理路径给显示出来,严重缺乏安全性,并且错误种类繁多,页面风格不一,导致用户体验不好,本 ...
- run a Freight robot (1)
1. Freight robot The Fetch and Freight Research Edition Robots are indoor laboratory robots. Coordin ...