加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Schema的优化和索引 - 选择最佳的数据类型 - 字符串类型

发布时间:2016-01-18 18:47:24 所属栏目:MySql教程 来源:网络整理
导读:字符串类型 MySQL支持很多字符串类型,以及它们的许多变化类型。这些数据类型在4.1和5.0版本变化都比较大。可以说变得更复杂了。早在4.1版本中,每个字符串列都
字符串类型

MySQL支持很多字符串类型,以及它们的许多变化类型。这些数据类型在4.1和5.0版本变化都比较大。可以说变得更复杂了。早在4.1版本中,每个字符串列都有自己的字符集和对于那些字符集的排序规则,或者叫做collation(校对)。

VARCHAR和CHAR

有两个主要的字符串类型就是VARCHAR和CHAR。它们都存储了字符值。不幸的是,很难准确解释这些值怎样存储在硬盘和内存中,因为这些都是有存储引擎实现的。我们假设你使用的是MyISAM和/或者InnoDB.如果不是,你最好查阅你使用存储引擎的相关文档。

让我们先看看VARCHAR和CHAR是怎样存储在硬盘上的。要注意的是存储引擎可能存储的CHAR或者VARCHAR在存入内存和硬盘上有所不同的,以及当服务器从存储引擎获得了这个值的时候,会把这个值转为另一个存储引擎的格式。下面就是两种类型的比较

VARCHAR:

VARCHAR存储了变长的字符串以及它是最常见的字符串数据类型。它占用的空间要少于定长的类型,因为它根据所需来决定需要的空间大小。特例就是MyISAM参数设为ROW_FORMAT=FIXED.这个参数使表的每一行使用固定大小的空间以及浪费大量的空间。

varchar使用了1或者2额外的字节记录值的长度:如果长度大约为255字节的话,大概使用1个字节,如果更多的话,那么就是2个字节。假如是latin1字符节,一个varchar(10)将会占用11字节的存储空间。一个varchar(1000)使用上限为1002字节。因为需要2字节存储长度信息。

VARCHAR会对性能有所帮助,因为它节约了空间。然而,因为行是变长,当你更新它们的时候,它们就会增长。这样会导致需要额外的一些工作。如果一行增长以及并不在原来的地址了。这些行为依赖于存储引擎。举个例子,MyISAM可能把行分为碎片。以及InnoDB可能切开页,把行填充到它的内部。其他的存储引擎可能在适当的地方不会更新数据。

当最大列长度比平均长度要大的时候就值得使用VARCHAR.当很少更新字段的时候,存储碎片就不是一个问题。以及当你使用复杂的字符集如UTF-8时,每个字符都使用变量的字节数存储。

在5.0以及最新的版本,当你存储和获取值的时候,MySQL会保留尾部的空格。在4.1和更早的版本,MySQL去掉尾部空格。

CHAR

CHAR是定长的:MySQL总是分配指定的内存空间去存储字符。当存储了一个CHAR值,MySQL去掉尾部空格。值附加了空格是比较的需要。

如果你存储的字符串是非常短的,用CHAR是非常有用的。举个例子,存储密码的MD5值使用CHAR是个好的选择。因为这个MD5一直是定长的。如果数据经常修改的话CHAR要优于VARCHAR。因为定长的行并不会有存储残片。对于非常短的列,CHAR要比VARCHAR高效。一个CHAR(1)用来存储Y和N值。这只会使用1个字节,但是一个VARCHAR(1)会使用两个字节。有个字节用来保存它的长度信息。

这个行为让人有点困惑,因此我们举一个例子。首先,我们创建一个有单独CHAR(10)列的表以及存储一些数值。

mysql> CREATE TABLE char_test( char_col CHAR(10));

mysql> INSERT INTO char_test(char_col) VALUES

-> ('string1'), (' string2'), ('string3 ');

当我们获取这个值的时候,尾部空格被去掉了。

mysql> SELECT CONCAT("'", char_col, "'") FROM char_test;

+----------------------------+

| CONCAT("'", char_col, "'") |

+----------------------------+

| 'string1' |

| ' string2' |

| 'string3' |

+----------------------------+

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读