一:表
表有字段,是key,字段值是value,一行数据就是一行记录,描述事物的一系列属性的值.
#语法: create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); #注意: 1. 在同一张表中,字段名是不能相同 2. 宽度和约束条件可选 3. 字段名和类型是必须的
二:数据类型
数值类型
日期时间类型
字符串类型
enum和set类型
1.数值类型
整数一般用int
age用int不规范,但是一般也用int
手机号11位,int不够用,一般用char,字符类型
int表示的数字范围不被宽度约束,只被范围约束,后面加的数字约束只是显示宽度,版本不同还可能不好用
因此int不用加宽度约束,默认就是11位就可以了,有一位是符号,数字只有10位,存不下手机号
小数一般用decimal表示钱,float double都不精确,double比float准一点所以字节多.
create table float_tb( -> f1 float, -> d1 double);
可以看到float double表示的长度和精度不一致,但是很少使用到double精确到小数后这么多,钱也就到分,小数点后两位
decimal(65,30)可以精确到小数点后30位,之所以这么准,是因为底层用的字符串来存的
可以看到没有指定精度的decimal只会保留整数部分,且会进位,所以价格定义时,decimal(11,2)到亿,精确到分
2.日期时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
timestamp只到2038年,所以很少用,而是用datatime来表示年月日时分秒
timestamp类型的数据默认是not null,只要插入数据或者更新数据,timestamp会自动的更新时间
create table t1(y year,d date,dt datetime,ts timestamp);
一起插year报错,可能是版本问题吧,这个版本不可以,但是可以看到插入y字段,ts也自动插入了
linux下可以
timestamp自动更新
一看看到timestamp后面加了 NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
CREATE TABLE `t2` ( `y` year(4) DEFAULT NULL, `d` date DEFAULT NULL, `dt`datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`t` time DEFAULT NULL, `ts` timestamp ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在5.5到5.6.4版本里,对于DEFAULT CURRENT_TIMESTAMP子句,只能TIMESTAMP类型列上指定。
而从5.6.5开始(也包括5.7),DEFAULT CURRENT_TIMESTAMP子句可以指定到TIMESTAMP或者DATETIME类型列上。
如果你的建表无法通过,select version();查看一下版本
3.字符串
常用的char(10),最多255个字符长度,varchar65535字符长度,前者定长字符串,传一个字符也是开你指定的字符空间,这里是10个
varchar(15)变长字符串,会根据传的字符个数,来开对应的空间,传abc,那么只开3个字符长度
前者有空间浪费,但效率相对高,后者空间浪费少,但是效率低,因为有判断字符长度的过程
手机号身份证号都用char,很多网站要就用户名几位密码几位,底层用的都是char
评论,微博,状态用varchar
5.ENUM和SET类型
ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。ENUM只允许从值集合中选取单个值,而不能一次取多个值。
SET和ENUM非常相似,也是一个字符串对象,里面可以包含0-64个成员。根据成员的不同,存储上也有所不同。set类型可以允许值集合中任意选择1或多个元素进行组合。对超出范围的内容将不允许注入,而对重复的值将进行自动去重。
mysql> create table t10 (name char(20),gender enum('female','male')); Query OK, 0 rows affected (0.01 sec) # 选择enum('female','male')中的一项作为gender的值,可以正常插入 mysql> insert into t10 values ('nezha','male'); Query OK, 1 row affected (0.00 sec) # 不能同时插入'male,female'两个值,也不能插入不属于'male,female'的值 mysql> insert into t10 values ('nezha','male,female'); ERROR 1265 (01000): Data truncated for column 'gender' at row 1 mysql> create table t11 (name char(20),hobby set('抽烟','喝酒','烫头','翻车')); Query OK, 0 rows affected (0.01 sec) # 可以任意选择set('抽烟','喝酒','烫头','翻车')中的项,并自带去重功能 mysql> insert into t11 values ('yuan','烫头,喝酒,烫头'); Query OK, 1 row affected (0.01 sec) mysql> select * from t11; +------+---------------+ | name | hobby | +------+---------------+ | yuan | 喝酒,烫头 | +------+---------------+ 1 row in set (0.00 sec) # 不能选择不属于set('抽烟','喝酒','烫头','翻车')中的项, mysql> insert into t11 values ('alex','烫头,翻车,看妹子'); ERROR 1265 (01000): Data truncated for column 'hobby' at row 1