1、字符串主要有下面类型:
char(len) varchar(len) 这里的len是字符个数
tinytext 、text 、mediumtext、longtext
binary 、 varbinary 、
tinyblob、blob、mediumblob、longblob、
enum 、set
2、 char和 varchar
字符型数据可以使用定长或变长的字符串来实现
char和varchar区别:
1> 固定长度的字符串使用空格向右填充,以保证占用相同的字节数;
变长字符串不需要向右填充,并且所有字节数可变。
当定义一个字符串列时,必须指定该列所能存放字符串的最大长度。
例如,存储最大长度不超过20个字符的字符串,使用下面的定义方式:
char(20) /fixed-length/
varchar(20) /variable-length/
2> char列可以设置的最大长度为255个字符,而varchar列最多可以存放65535个字节。
如果需要存储更长的字符串,则需要使用文本类型(mediumtext和longtext)。
对char最大长度为255个字符说明:
对char(len) 和 varchar(len) 中的len是字符个数的验证:
表 tmp2的字符集为 UTF8
对char存储255个字节,varchar存储65535个字节,len为字符说明:
1> 和编码有关
编码不同,varchar(L)里的最大值L是不同的。
utf8中,一个字符占3个字节,所以L = 65533/3 = 21844
gbk编码中一个字符占2个字节,所以L = 65533 / 2 = 32766
2> varchar的len最大只能是 21845
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3、 文本数据 tinytex text mediumtext longtext
如果需要存储的数据超过64kb(varchar列所能容许的上限),就需要使用文本类型,下表显示了可用的文本类型及它们的最大长度:
当使用文本类型时,应注意下列事项:
- 如果被装载到文本列中的数据超出了该类型的最大长度,数据将会被截断
- 在向文本列装载数据时,不会消除数据的尾部空格
- 当使用文本列排序或分组时,只会使用前1024个字节,在需要时可以放宽这个限制
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4、binary 和 varbinary
binary 和 varbinary存储二进制串而非字符串,所以他们没有字符集
5、tinyblob、blob、mediumblob、longblob
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6、emum 枚举类型
enum是一个字符串对象,是一个枚举类型,枚举列可以把一些不重复的字符串存储为一个预定义的集合,MySQL在存储枚举值时非常紧凑,会根据列表值的数量压缩到一个或者两个字节中。MySQL在内部会将每个值在列表中的位置保存为整数,并且在表的.frm文件中保存“数字-字符串”映射关系的“查找表
枚举值在表创建时规定,enum是单选的,例如 sex enum(“男”,“女”)
字段的值只能是 男 或 女,否则会报错
可以看到实际存储为整数,存储整数为每个值在枚举列表中的位置,
1> 枚举类型在创建表时必须指明枚举值,不建议使用数字来作为枚举值,可能导致实际存储值和枚举值混淆
2> 枚举值不能重复
3> 向枚举类型插入数据时,只能是枚举值中的一项,否则会报错。在存储时实际为整数,这个整数是枚举值在列表中的位置,而不是字符串,可以通过数字上下文环境检索到这个属性
4> 在用枚举字段排序时,使用枚举值在列表中的位置进行排序,而非枚举值排序
那么如何才能正常按照枚举值来排序呢,解决方法是 在定义枚举值时,按照自然顺序列举枚举值。
枚举类型的缺点:字符串列表是固定的,添加或删除字符串必须使用ALTER TABLE。对于一些列未来可能会改变的字符串,使用枚举不是一个好主意,除非能接受只在列表末尾添加元素,这样在MySQL5.1中就可以不用重建整个表来完成修改。
由于MySQL把每个枚举值保存为整数,使用索引查找,并且必须进行查找才能转换为字符串,所以枚举列有一些开销。通常枚举的列表都比较小,所以开销还可以控制,但也不能保证一直如此。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7、set 集合类型
set集合类型,多选类型
例如一个人的爱好,可能会有多个
1> set在创建表时必须指明集合值,set最多可以设置64个值
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8、mysql字符集:
对于拉丁系语言,比如英语,包含了一系列字母,每个字母只需要1个字节来存储。
其他一些语言(如日语和韩语)则包含了大量字符,每个字符的存储需要多个字节,因此这里字符集称为 多字符集。
mysql中可以使用各种字符集来存储数据,包括单字符集和多字符集,使用
show character set;;
查看服务器支持的字符集,如果maxlen大于1,则该字符集为多字符集
在安装mysql服务器时,latin1字符集将会被字段选择为默认字符集
可以为数据库中的每个字符列选择不同的字符集,甚至可以在同一个数据表内存储不同的字符集数据。
为数据列指定非默认的字符集,只需要在类型定义后加上系统支持的字符集名称,如
varchar(20) character set utf8
在mysql中,可以改变整个数据库的默认字符集:
create database foreign character set utf8;