mysql--字符类型

来源:互联网 发布:上瘾 网络剧 日本评论 编辑:程序博客网 时间:2024/06/09 16:22

字符

这里写图片描述

char varchar

定义

char(n)     n的范围 0--255varchar(n)  n的范围,0-255(5.0.3以前) ,0-65535之后()n的表示      5.X以后表示的是字符.之前表示的是字节

存储

varchar需要额外的空间存储字段的实际长度char/varchar对于超过长度的处理--截断char/varchar对于未超过长度的处理

这里写图片描述

字节和字符

length:   是计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符CHAR_LENGTH(str) 返回值为字符串str 的长度,长度的单位为字符select id,name,length(name),char_length(name)  from test_varchar_utf8;+----+--------------------------------------+--------------+-------------------+| id | name                                 | length(name) | char_length(name) |+----+--------------------------------------+--------------+-------------------+|  1 | 12345678901                          |           11 |                11  ||  3 | 你                                            |            3 |                 1   ||  4 | 你好                                         |            6 |                 2   |+----+--------------------------------------+--------------+-------------------+

查询

查询时CHAR列删除了尾部的空格,VARCHAR保持原样mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));mysql> INSERT INTO vc VALUES ('ab  ', 'ab  ');mysql> SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;+----------------+----------------+| CONCAT(v, '+') | CONCAT(c, '+') |+----------------+----------------+| ab  +          | ab+            |+----------------+----------------+

引擎

MyISAM 数据存储引擎和数据列:MyISAM数据表,最好使用固定长度(CHAR)的数据列代替可变长度(VARCHAR)的数据列。MEMORY存储引擎和数据列:MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没有关系。两者都是作为CHAR类型处理的。InnoDB 存储引擎和数据列:建议使用 VARCHAR类型。对于InnoDB数据表,**内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针)**,因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR,因 此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。

varchar text

区别

对于text字段,MySQL不允许有默认值。 varchar允许有默认值

存储

都需要额外地保存该字段的实际长度,叫overhead.

- varchar 小于255byte  1byte overhead- varchar 大于255byte  2byte overhead- tinytext 0-255 1 byte overhead- text 0-65535 byte 2 byte overhead- mediumtext 0-16M  3 byte overhead

overflow存储

- varchar(255+)存储上和text很相似- text 是要要进overflow存储。 前768字节和原始的行存储在一块,多于768的行会存在和行相同的Page或是其它Page上。- varchar 在MySQL内部属于从blob发展出来的一个结构,在早期版本中innobase中,也是768字节以后进行overfolw存储。- 对于Innodb-plugin后: 对于变长字段处理都是20Byte后进行overflow存储

text blob

区别

BLOB:采用二进制存储、没有字符集或排序规则TEXT:采用字符方式存储、有字符集和排序规则    

空洞

text和blob在大量删除/更新以后会留下碎片空间,影响后续数据的性能建议定期使用 optimize table 碎片整理 

搜索

使用合成索引或者前缀索引

设计

最好尽量避免使用这两类型如果可以、可以把BLOB货TEXT 列分离成单独的表     

Enum/Set

这里写图片描述

ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。

如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

MySQL也有一个“建议”(见第十条)告诉你怎么去重新组织你的表结构。当你有一个 VARCHAR 字段时,这个建议会告诉你把其改成 ENUM 类型。使用 PROCEDURE ANALYSE() 你可以得到相关的建议。

选择

1.不建议使用blob,使用文件服务器存储文件
2.推荐使用varchar
3.

原创粉丝点击