1.timestamp还有一个重要特点,就是和时区相关。
 
查看当前时区语句:
 
show VARIABLES like 'time_zone';
 
结果:
 
 
 
 
时区值为system,因为我们在中国,实际是”东八区“(+8:00)。
 
修改时区语句:
 
set time_zone = '+9:00';修改时区为东九区。
 
timestamp的取值范围是19700101080001到2038年的某一天,因此它不适合存放比较久远的日期。
 
问题:
 
为什么测试这个时间戳的值不行?刚好的这个1970值不行,其他值也不行。
 
sql语句如下:
 
create table b
 
(
 
id1 TIMESTAMP
 
);
 
insert into b values('20300101080001');
 
 
 
 
DATE,DATETIME,TIME是最常使用的三种日期类型。
 
DATE:如果要用来表示年月日,通常用DATE来表示。
 
DATETIME:如果要用来表示年月日时分秒,通常用DATETIME来表示。
 
TIME:如果要用来表示时分秒,通常用TIME来表示。
 
YEAR类型主要用来表示年份,当只需记录年份时,用YEAR比DATE更节省空间。
 
Mysql以YYYY格式显示YEAR值,范围1901~2155,当使用两位字符串表示年份时,
 
范围为00~99.
 
00~69的值,被转换为2000~2069,
 
70~99的值,被转换为1970~1999.
 
将一个日期时间值插入到表中,这个日期时间格式允许不严格语法,任何标点符都可以用做日期部分或时间部分之间的间隔符。例如“98-12-13 11:30:45”,“98/12/31 11*30*45”.“98@12@31 11^13^31”是等价的。如果日和月的值小于10,不需要指定两位数,比如“1997-6-9”和“1997-06-09”是一样的。
 
2.字符串类型
 
2.1 char和varchar类型
 
二者最主要的区别是存储方式的不同。char长度可以为0~255的任何值,固定长度。
 
而varchar长度可以为0~65535,可变长度。
 
显示字符串的长度语句:
 
select length(c),length(v) from vc;
 
 
 
 
但这样看的还不够清楚,可以用这样的语句:
 
SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc;
 
 
 
 
显然,char列最后的空格在做操作时都已经被删除,而varchar依然保留空格。
 
2.2 binary和varbinary类型
 
问题二:对于binary数据类型,为什么插值不能是第二种呢?而要用set?这是为什么?
 
create table t1
 
(
 
c BINARY(3)
 
);
 
insert into t1 set c="a";
 
insert into t1 values(c="a");
 
2.3 ENUM类型(是字符串类型)
 
enum类型是忽略大小写的,如果你插入值时写的是小写,原本规定是大写,那它会转换成大写,小写字母同理。
 
当你填的enum类型字段值不是枚举范围内的值的话,会默认为第一个值。
 
另外插值还可以这样插,就是在values后面再加个括号,插2行值,当然也可以多个。
 
而且enum类型字段值,只能从多个枚举值中选出一个值。
 
enum类型对于1~255个成员的枚举需要一个字节的存储,对于255~65535个成员需要两个字节的存储。最多允许有65535个成员。
 
2.4 SET类型(是字符串类型)
 
和enum类型,有点相似。可以包含0~64个成员,
 
1~8成员的集合,占1个字节
 
9~16成员的集合,占2个字节。
 
17~24成员的集合,占3个字节。
 
25~32成员的集合,占4个字节。
 
33~64成员的集合,占8个字节。
 
set和enum除了存储之外,最主要的区别在于set类型一次可以选取多个成员,而enum只能选一个。
 
对于set类型,可以一次选取多个值,但是如果选的值重复,那重复的值只会选一次。而且如果选的值是set类型里面没有的,那将会插入不成功。可以是允许值的组合范围内。
 
create table t5
 
(
 
col SET('a','b','c','d')
 
);
 
insert into t5 values('a,b'),('a,d,c');