MySQL中char、varchar和text

数据的检索效率是:char > varchar > text

一、text:mysql中的text对应oracle中的clob,text列不能有默认值
又分为TINYTEXT, TEXT, MEDIUMTEXT,LONGTEXT, 都是表示数据长度类型的一种。
语法:[ UNSIGNED --无符号的] mediumtext
TINYTEXT: 256 bytes
TEXT: 65,535 bytes(2^16-1字符) => ~64kb
MEDIUMTEXT: 16,777,215 bytes(2^24-1字符) => ~16MB
LONGTEXT: 4,294,967,295 bytes(2^32-1字符) => ~4GB

以utf8编码计算的话
LONGTEXT:4294967295/3=1431655765个汉字,14亿,存储空间占用:4294967295/1024/1024/1024=4G的数据;
MEDIUMTEXT:16777215/3=5592405个汉字,560万,存储空间占用:16777215/1024/1024=16M的数据;
TEXT:65535/3=21845个汉字,约20000,存储空间占用:65535/1024=64K的数据;

二、char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用什么trim之类的函数去过滤空格。

三、varchar:存储变长数据,但存储效率没有CHAR高,必须在括号里定义长度,可以有默认值。保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。

mysql的varchar与oracle的varchar2是不一样的,前者是用字符做单位的,后者是用字节做单位的。

所以:

oracle 中varchar2(10)  既10个字节3个汉字

mysql  中varchar(10) 既10个字符10个汉字

 

  • 经常变化的字段用varchar;
  • 知道固定长度的用char;
  • 尽量用varchar;
  • 超过255字节的只能用varchar或者text;
  • 能用varchar的地方不用text;
  • 能够用数字类型的字段尽量选择数字类型而不用字符串类型的(电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了

 

四、日期时间

 

类型

范围

说明

Date 日期(yyyy-mm-dd)  
Time 时间(hh:mm:ss)  
DateTime 日期与时间組合(yyyy-mm-dd hh:mm:ss)  
TimeStamp yyyymmddhhmmss  
Year

年份yyyy

 

你可能感兴趣的:(Mysql)