mysql数据类型

来源:互联网 发布:淘宝oem化妆品假货店 编辑:程序博客网 时间:2024/05/21 01:27

tinyint  1字节

smallint 2字节

int   4字节

bigint 8字节



char varchar text的区别:

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

空间占用方面,就要具体情况具体分析了。

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

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

text:存储可变长度的非Unicode数据,最大长度为2^31-1个字符。text列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。

关于存储空间:

在使用UTF8字符集的时候,手册上是这样描叙的:

     1、基本拉丁字母、数字和标点符号使用一个字节;
     2、大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言;
     3、韩语、中文和日本象形文字使用三个字节序列。


结论:

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


timestamp 和 datetime 和 date比较

一、TIMESTAMP
显示格式:YYYY-MM-DD HH:MM:SS
时间范围:[ '1970-01-01 00:00:00'到'2037-12-31 23:59:59']
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  在创建新记录和修改现有记录的时候都对这个数据列刷新。
TIMESTAMP DEFAULT CURRENT_TIMESTAMP  在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它。
TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  在创建新记录的时候把这个字段设置为0,以后修改时刷新它。
TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP  在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它
 
1、TIMESTAMP列不为空时,默认值可以为“0000-00-00 00:00:00”,但不能为null。
2、一个表可以存在多个TIMESTAMP列,但一个表只有一个TIMESTAMP类型的字段可以在默认值或者UPDATE部分用CURRENT_TIMESTAMP,即设置为数据更新而改变为数据库系统当前值。
3、TIMESTAMP列的默认值是CURRENT_TIMESTAMP常量值。当纪录数据发生变化的时候,TIMESTAMP列会自动将其值设定为CURRENT_TIMESTAMP。
4、TIMESTAMP列创建后的格式是:
ALTER TABLE `course`
ADD COLUMN `birthday`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
 
ALTER TABLE `course`
ADD COLUMN `birthday`  timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP ;
 
ALTER TABLE `course`
ADD COLUMN `birthday`  timestamp NULL AFTER `cname`;
 
二、DATETIME
显示格式:YYYY-MM-DD HH:MM:SS
时间范围:[ '1000-01-01 00:00:00'到'9999-12-31 23:59:59']
 
三、DATE
显示格式:YYYY-MM-DD
时间范围:['1000-01-01'到'9999-12-31']
 
四、日期格式转换
1、字符串转日期
select STR_TO_DATE('2013-01-29 13:49:18', '%Y-%m-%d %H:%i:%s')
2、日期转字符串
select DATE_FORMAT('2013-01-29 13:49:18', '%Y-%m-%d %H:%i:%s')
 
五、日期的中常用的年月日时分秒星期月份等获取方法
select TIMESTAMP('2013-01-29 13:50:27');
select DATE('2013-01-29 13:50:27');
select YEAR('2013-01-29 13:50:27');
select MONTH(('2013-01-29 13:50:27');
select WEEK('2013-01-29 13:50:27');
select DAY('2013-01-29 13:50:27');
select TIME('2013-01-29 13:50:27');
select CURTIME();
select CURDATE();
select CURRENT_DATE;
select CURRENT_TIME;
select CURRENT_TIMESTAMP;
select NOW()
 
六、日期的运算:
SELECT DATE_ADD('2013-01-29 13:50:27', INTERVAL 1 DAY);
                -> '2013-01-30 13:50:27'
SELECT DATE_ADD('2013-01-29 13:50:27', INTERVAL 1 HOUR);
                -> '2013-01-29 14:50:27'
SELECT DATE_ADD('2013-01-29 13:50:27', INTERVAL 1 MONTH);
               -> '2013-02-28 13:50:27'

相同点:
      显示
      TIMESTAMP列的显示格式与DATETIME列相同。换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。
不同
      范围
      datetime 以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值。支持的范围为'1000-01-01 00:00:00'到'9999-12-31 23:59:59'TIMESTAMP值不能早于1970或晚于2037
      储存
      TIMESTAMP
         1.4个字节储存(Time stamp value is stored in 4 bytes)
         2.值以UTC格式保存( it stores the number of milliseconds)
         3.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。
      datetime
         1.8个字节储存(8 bytes storage)
         2.实际格式储存(Just stores what you have stored and retrieves the same thing which you have stored.)
         3.与时区无关(It has nothing to deal with the TIMEZONE and Conversion.)
实例对比
     现在我来做个时区对他们的影响。
    1.先插入一个数据insert into `t8` values(now(), now());
    2.改变客户端时区(东9区,日本时区)。
    3.再次显示插入的数据,变化了,timestamp类型的数据 增加了 1个小时



0 0