1.char与varchar
CHAR 和 VARCHAR 类型类似,都用来存储字符串,但它们保存和检索的方式不同。
CHAR 属于固定长度的字符类型,而 VARCHAR 属于可变长度的字符类型。
有一点需要注意的就是超过列长度的值将不会被保存。
从 CHAR(4)和 VARCHAR(4)列检索的值并不总是相同,因为检索时从 CHAR 列删除了
尾部 的空格。下面通过一个例子说明该差别:
CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
INSERT INTO vc VALUES ('ab ', 'ab ');
SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
由于 CHAR 是固定长度的,所以它的处理速度比 VARCHAR 快得多,但是其缺点是浪费
存储空间,程序需要对行尾空格进行处理,所以对于那些长度变化不大并且对查询速度有
较 高要求的数据可以考虑使用 CHAR 类型来存储。
*在 MySQL 中,不同的存储引擎对 CHAR 和 VARCHAR 的使用原则有所不同,这里简单概 括如下。
MyISAM 存储引擎:建议使用固定长度的数据列代替可变长度的数据列。
MEMORY 存储引擎:目前都使用固定长度的数据行存储,因此无论使用 CHAR 或 VARCHAR 列
都没有关系。两者都是作为 CHAR 类型处理。
InnoDB 存储引擎:建议使用 VARCHAR 类型。对于 InnoDB 数据表,内部的行存储
格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因
此在 本质上,使用固定长度的 CHAR 列不一定比使用可变长度 VARCHAR 列性能要好。
因而,主 要的性能因素是数据行使用的存储总量。由于 CHAR 平均占用的空间多于
VARCHAR,因此使 用 VARCHAR 来最小化需要处理的数据行的存储总量和磁盘 I/O
是比较好的。
2.TEXT 与 BLOB
在保存少量的字符串使用char和varchar,但是在保存较大文本时,一般选择使用text和blob.
它们的主要区别在于blob能保存二进制数据,比如照片,text只能保存字符数据,
BLOB 和 TEXT 值会引起一些性能问题,特别是在执行了大量的删除操作时。
删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上面会有影响。
为了提高性能,建议定期使用OPTIMIZE TABLE 功能对这类表进行碎片整理,避 免因为“空洞”导致性能问题。
下面的例子描述了 OPTIMIZE TABLE 的碎片整理功能。
可以使用合成的(Synthetic)索引来提高大文本字段(BLOB 或 TEXT)的查询性能。 简单来说,合成索引就是根据大文本字段的内容建立一个散列值,并把这个值存储在单独的 数据列中,接下来就可以通过检索散列值找到数据行了。但是,要注意这种技术只能用于精 确匹配的查询(散列值对于类似=等范围搜索操作符是没有用处的)。可以使用 MD5() 函数生成散列值,也可以使用 SHA1()或 CRC32(),或者使用自己的应用程序逻辑来计算散列 值。请记住数值型散列值可以很高效率地存储。同样,如果散列算法生成的字符串带有尾部 空格,就不要把它们存储在 CHAR 或 VARCHAR 列中,它们会受到尾部空格去除的影响。合 成的散列索引对于那些 BLOB 或 TEXT 数据列特别有用。用散列标识符值查找的速度比搜索 BLOB 列本身的速度快很多。
下面通过实例介绍一下合成索引的使用方法。
3 浮点数与定点数
浮点数:一般用于表示含有小数部分的数值。当一个字段被定义为浮点类型后,如果插入
数据的精度超过该列定义的实际精度,则插入值会被四舍五入到实际定义的精度值,然
后插 入,四舍五入的过程不会报错。在 MySQL 中 float、double(或 real)用来表示浮点数.
定点数:不同于浮点数,定点数实际上是以字符串形式存放的,所以定点数可以更加精确 的保存数据。
如果实际插入的数值精度大于实际定义的精度,则 MySQL 会进行警告(默认 的 SQLMode 下),但
是数据按照实际精度四舍五入后插入;如果 SQLMode 是在 TRADITIONAL (传统模式)下,则系统
会直接报错,导致数据无法插入。在 MySQL 中,decimal(或 numberic) 用来表示定点数。