MySQLのデータ型-字符串
字符串值
字符串值可以分为两大类:
- 二进制:一些字节序列、对这些字节的解释不牵涉任何字符集概念。BINARY | VARBINARY
- 非二进制:由字符构成的序列。CHAR | VARCHAR
查知服务器都有哪些字符集和排序方式可供选用:
mysql> SHOW CHARACTER SET;
mysql> SHOW COLLATION;
字符串比较操作:
- 二进制字符串的比较操作是逐字节进行的,其结果只取决于各字节的数值大小。
- 非二进制字符串的比较操作是逐字符进行的,每个字符的相对值取决于当前所使用的字符集的排序方式。
可以用CHARSET()或COLLATION()函数来查出字符串所使用的字符集和排序方式。
CHAR VARCHAR的区別:
- 长度
- CHAR:固定
- VARCHAR:可变
- 数据列检索出来的值的尾缀空格
- CHAR:尾缀空格将被去掉
※ PAD_CHAR_TO_ FULL_LENGTH SQL模式让MySQL保留从CHAR数据列检索出来的值的尾缀空格 - VARCHAR:保留
- CHAR:尾缀空格将被去掉
その他:
- 在对长度可变的数据进行处理时,MySQL要把数据内容和数据长度都保存起来。这些额外的字节将被当做无符号整数来对待
- 一个长VARCHAR数据列需要2个字节来存放字符串值的长度,这两个字节计算在数据行总长度之内。
- 数据表里往往还有其他的数据列,而那些数据列将挤占VARCHAR数据列的“生存”空间。
- 如果你的数据都是M个字符长,一个VARCHAR(M)数据列将比一个CHAR(M)数据列多占用一些存储空间,因为数据列里的每一个值还要多用一个或两个字节来保存其长度
- 使用MyISAM数据表,那么选用CHAR类型往往要比选用VARCHAR类型的效果好一些
- 二进制排序方式在比较两个字符时使用的是它们的数值编码。
在处理字符数据列的定义时,MySQL将依次根据下述原则为它指定一个字符集。
- 如果数据列的定义里指定了一个字符集,就使用这个字符集。
- 否则,如果数据表的定义里有一个数据表级的字符集选项,就使用那个字符集。
- 否则,使用数据库的字符集作为数据表的默认字符集,该字符集还将成为数据列的默认字符集
为字符串数据列挑选数据类型的注意事項:
- 应该把值表示为字符数据还是二进制数据?
- 比较操作需要区分字母的大小写情况吗?如果是,则应该选用一种非二进制字符串类型,让存储在数据库里的字符与一种字符集和排序方式关联起来。
- 如果你需要对数据列里的数据分别进行区分大小写的比较和不区分大小写的比较,请使用你最经常进行的比较所用的排序方式。等你需要进行其他类型的比较时,利用COLLATION操作符临时改变一下排序方式就行了
- 你想尽量少占用存储空间吗?如果是,选用一种可变长度的类型,不要选用固定长度的类型。
- 数据列的可取值总是某几个合法值之一或它们的组合吗?如果是,ENUM或SET类型往往是最好的选择。
- 尾缀的空格(或零值字节)很重要吗?
- 非二进制字符串选用一个TEXT或VARCHAR数据列、为二进制字符串选用一个BLOB或VARBINARY数据列
参考:
Mysql技術内幕 【美】Paul DuBois