字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工做以及如何在查询中使用这些类型。mysql
类型 | 大小 | 用途 |
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
CHAR 和 VARCHAR 类型相似,但它们保存和检索的方式不一样。它们的最大长度和是否尾部空格被保留等方面也不一样。在存储或检索过程当中不进行大小写转换。sql
BINARY 和 VARBINARY 相似于 CHAR 和 VARCHAR,不一样的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,而且排序和比较基于列值字节的数值值。数据库
BLOB 是一个二进制大对象,能够容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不一样。ide
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不一样,可根据实际状况选择。spa
数据库实例操做charvarvhar:orm
mysql> create table t5 ( -> n1 char(10), -> n2 varchar(10) -> ); Query OK, 0 rows affected (0.03 sec) mysql> insert into t5 values (' hello ',' hello '); Query OK, 1 row affected (0.01 sec) mysql> select concat('!',n1,'!'),concat('!',n2,'!') from t5; +--------------------+--------------------+ | concat('!',n1,'!') | concat('!',n2,'!') | +--------------------+--------------------+ | ! hello! | ! hello ! | +--------------------+--------------------+ 1 row in set (0.00 sec)
CHAR(M)定义的列的长度为固定的,M取值能够为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检 索到CHAR值时,尾部的空格被删除掉。在存储或检索过程当中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,好比定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。对象
VARCHAR(M)定义的列的长度为可变长字符串,M取值能够为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用 的字符集肯定。总体最大长度是65,532字节)。VARCHAR值保存时只保存须要的字符数,另加一个字节来记录长度(若是列声明的长度超过255,则 使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有 CHAR高。若是一个字段可能的值是不固定长度的,咱们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为何”+1″呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际状况找到权衡点。排序
CHAR和VARCHAR最大的不一样就是一个是固定长度,一个是可变长度。因为是可变长度,所以实际存储的时候是实际字符串再加上一个记录 字符串长度的字节(若是超过255则须要两个字节)。若是分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。若是被裁掉 的字符不是空格,则会产生一条警告。若是裁剪非空格字符,则会形成错误(而不是警告)并经过使用严格SQL模式禁用值的插入.索引
字符串text实例:字符串
mysql> create table t6 ( -> n1 text -> ); Query OK, 0 rows affected (0.02 sec) mysql> insert into t6 values ("sdasadsadsaaaaadassd") -> ; Query OK, 1 row affected (0.01 sec) mysql> select * from t6; +----------------------+ | n1 | +----------------------+ | sdasadsadsaaaaadassd | +----------------------+ 1 row in set (0.00 sec)
注意:与char和varchar不一样的是,text不能够有默认值,其最大长度是2的16次方-1。
ENUM 类型
ENUM 是一个字符串对象,其值一般选自一个容许值列表中,该列表在表建立时的列规格说明中被明确地列举。
在下列某些状况下,值也能够是空串("") 或 NULL;
若是将一个无效值插入一个 ENUM (即,一个不在容许值列表中的字符串),空字符串将做为一个特殊的错误值被插入。事实上,这个字符串有别于一个"普通的"空字符串,由于这个字符串有个数字索引值为 0。稍后有更详细描述。
若是一个 ENUM 被声明为 NULL,NULL 也是该列的一个合法值,而且该列的缺省值也将为NULL 。若是一个 ENUM 被声明为 NOT NULL,该列的缺省值将是该列表所容许值的第一个成员。
mysql> create table t7 ( -> gender enum ('男','女') -> ); Query OK, 0 rows affected (0.01 sec) mysql> insert into t7 values ('男'); Query OK, 1 row affected (0.01 sec) mysql> insert into t7 values ('女'); Query OK, 1 row affected (0.00 sec) mysql> insert into t7 values ('中'); ERROR 1265 (01000): Data truncated for column 'gender' at row 1 mysql> select * from t7; +--------+ | gender | +--------+ | 男 | | 女 | +--------+ 2 rows in set (0.00 sec)