在使用MySQL创建数据表时都会遇到一个问题,如何为字段选择合适的数据类型呢?下面从几个常用的类型来进行介绍!
8.1 CHAR 和 VARCHAR
CHAR
和VARCHAR
类型相似,都用来存储字符串,但他们保存和检索的方式不同,CHAR
属于固定长度的字符类型,而VARCHAR
属于可变长的字符类型。
注意:CHAR
类型数据会自动将尾部空格去除,如图
1.我们创建一个vc表,其中两个列分别是varchar(4)
,char(4)
2.插入两条数据,都是‘ab ’
;
3.通过concat()函数可以清楚的看见char函数会自动将末尾的空格去除
如何选择这两种类型?
由于CHAR
是固定长度的,所以他的处理速度比VARCHAR
快很多,但是其缺点是浪费空间,程序需要对尾部的空格进行处理,所以对于那些长度变化不大并且对查询速度有很高要求的数据可以优先考虑CHAR来存储。
另外,随着MySQL
版本的不断升级,VARCHAR
数据类型的性能也在不断的提高,所以在很多应用中,VARCHAR
类型被更多的使用。
在MySQL
中,不同的存储引擎对CHAR
和VARCHAR
的使用原则有所不用,简单描述:
-
MyISAM
存储引擎:建议使用固定长度的CHAR
代替VARCHAR
可边长的数据列 -
MEMORY
存储引擎:目前都是用固定长度的数据类型存储,因此勿论使用CHAR
,VARCHAR
列都没有关系,两者都是作为CHAR
类型处理。 -
InnoDB
存储引擎:建议使用VARCHAR
类型。
8.2 TEXT 和 BLOB
一般在保存少量的字符串的时候,我们会选CHAR
或者VARCHAR
;而在保存较大文本时,通常会使用TEXT
和BLOB
,二者之间的主要差别在于BLOB
能够保存二进制数据比如照片,而TEXT
只能保存字符数据,比如一篇文章或者日记,TEXT
和BOLB
的分类如下:
- TEXT
- MEDIUMTEXT
- LONGTEXT
- BLOB
- MEDIUMBLOB
- LONGBLOB
三种类型主要根据存储文本长度以及存储字节
的不同,根据实际情况选择能够满足需求的最小存储类型
注意:
- BLOB和TEXT值回引起一些性能问题,特别是在执行了大量的删除操作时。
删除操作会在数据表中留下很大的空洞,以后填入这些空洞的记录在插入的性能上会有影响,为了提高性能,建议定期使用OPTIMIZE TABLE
功能对这类表进行碎片整理,避免因为“空洞”而导致性能问题。
-
可以使用合成的索引来提高大文本字段的查询性能
比如说,你存储了一段很长的文字,但是你现在需要根据这段文字来查询到对应的记录,就会造成查询性能大大降低,可以根据大文本内容建立一个散列值,并将这个散列值存储在单独的数据列中,接下来就可以通过检索索引就可以找到数据行了。(但是要注意这种技术只能用在精确查找上),请记住数值类型散列值可以很高效率的存储,同时如果生成的散列值含有空格就不要把他存储在CHAR
或者VARCHAR
中,他们会受到尾部空格去除的影响,用散列标识符来查找的速度比检索BLOB
或者TEXT
本身快的多的多。 -
在不必要的时候避免检索大型的BLOB或者TEXT的值
就像要检索一篇博客,你如果根据博客内容在csdn上搜索,那可能要等很久了,所以csdn并不会提供这样的功能。 -
把BLOB或者TEXT的列分离到单独的表中
在某些环境中,如果把这些数据列移动到第二张数据表中,可以把原数据表中的数据列转换成固定长度的数据行格式,这会减少主表中的碎片,可以得到固定长度数据行的性能优势。
以上几点都是在使用TEXT和BLOB数据类型时应该考虑的问题!
8.3 浮点数和定点数
浮点数一般用于表示含有小数部分的数值,当一个字段被定义为浮点类型之后,如果插入数据的精度超过该列定义的实际精度,则插入值会被四舍五入到实际定义的精度值,然后插入,四舍五入的过程不会报错,在MySQL
中float
,double
用来表示浮点数。
点定数不同于浮点数,定点数实际上是以字符串形式存放的,所以定点数可以更精确的保存数据,如果插入的数值精度大与实际定义的精度,则MySQL会进行警告,但是数据按照实际精度四舍五入后保存,在MySQL
中,decimal
和numberic
用来表示点定数。
举个例子:
从上面看出,浮点类型的131072.32变成了131072.31,这是上面的数值在使用单精度浮点数表示时,产生了误差,这是浮点数特有的问题,因此在精确度比较高的应用中(如货币)要使用定点数而不是浮点数保存数据。
在关于浮点数和定点数的应用中,开发者应该注意以下几个原则:
- 浮点数存在误差问题
- 对货币等精度敏感的数据中,应该用点定数进行保存
- 在编程中如果用到浮点数,要特别注意误差问题,并尽量避免浮点数比较
- 要注意浮点数中一些特殊值的处理
8.4 浮点数和定点数
MySQL提供的常用的日期类型有:
- DATE
- TIME
- DATATIME
- TIMESTAMP
区别之前已经说过了,下面总结选择日期类型的原则
根据实际需要选择能够满足需求的最小存储的日期类型,如果只记录年份,则1个字节的YEAR
类型就可以满足,而不需要使用四个字节的DATE
类型。
如果要存储年月日时分秒,并且记录的年份比较久远,最好使用DATETIME,而不要使用TIMESTAMP
,因为TIMESTAMP
表示的日期范围比DATETIME
要短的多
如果记录的日期要让不同的时区的用户使用,那么最好使用TIMESTAMP
,因为日期类型中只有他能够和实际时区相对应
8.5 小结
本节主要介绍了常用的数据类型和选择原则
- 对于字符类型,要根据存储引擎来进行对应的选择
- 对精度要求较高的应用中,建议使用定点数存储数值,以保证结果的正确性。
- 对含有TEXT和BLOB字段的表,如果经常做删除和修改记录的操作要定期执行 OPTIMIZE TABLE功能对表进行碎片处理
- 日期类型应根据实际需要选择能够满足应用的最小存储的日期类型
问题反馈
在使用学习中有任何问题,请留言,或加入Android、Java开发技术交流群