mysql 字符串类型

字符串类型

字符串类型指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), VARCHAR(M)不一样之处

    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 被声明为 NULLNULL 也是该列的一个合法值,而且该列的缺省值也将为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)
相关文章
相关标签/搜索