创建table表
别人给我们建好了表,我们可以增删改查数据,特别是查询,变化非常大。
如果别人没有把表给我们,我们连上数据库,要自己建一张表,根据项目的要求,做一个博客,一个商城,具体分析这个商城项目应该如何建表。如何建一张表?我们把表头声明完之后,表就已经声明好了;
所谓建表的过程 ---> 就是声明表头的过程;表头的第一行 ---> 我们叫做列,里面起的名字,我们叫 列名拿到数据中来说: 我们建表的过程 => 就是 声明列 的过程;建立以个简单的表:
1 CREATE TABLE t1(2 sn INT,3 name VARCHAR(10)4 );
我们用word建表,每个列是都不是等宽分布的,同样在数据库中,表中的列并不是等宽的
像: 学号 姓名 家庭地址 性别我们要根据这个字段有可能要存储的最大的长度,来给列分布一个最合理的宽度。
如果分配的太宽了,A4纸就浪费了,如果分配的太窄了,有可能内容就放不下了。数据库将我们的内容放在磁盘上,我们的内存也是有限的,所以我们在建表的时候需要考虑列的属
性。我们要分析,就是这个列,最大能存多少,然后我们选取一个合理的列类型,合理的列宽度;使之既能放下内容,不浪费磁盘空间,还要查询速度快。列的属性声明规则:
CREATE TABLE 表名 (列1 列类型 [列属性 默认值],列2 列类型 [列属性 默认值],.....列n 列类型 [ 列属性 默认值]);
最后还需要声明引擎和字符集
1 CREATE TABLE 表名 (2 列1 列类型 [列属性 默认值],3 列2 列类型 [列属性 默认值],4 .....5 列n 列类型 [ 列属性 默认值]6 )ENGINE=MyISAM DEFAULT CAHRSET=utf8;
HTML之前的设置为UTF-8
MySQL设置为utf8,没有杠。列的三大分类
列类型大致分为3类:
1.数值型整型,浮点型,定点型2.字符串char,varchar,text3.日期时间类型 2012-12-13 14:26:23(略。。。。。一般存储注册时间,商品发布时间等,并不是用datetime存储,是用时间戳,且用的还是PHP的
时间戳,而不是MYSQL的。)
整型
mysql 利用的是字节来表示范围和宽度的。
之前创建过一个表,是int类型的,占4个字节。1个字节有8个位,每一个位上都有0、1两种可能。0000 0000那4个字节int类型在磁盘中比如说存放1这个数字,存法如下:
00000000 00000000 00000000 00000001int类型存储的范围是多少能不能算出来?
11111111 11111111 11111111 111111112的32次方-1大概是42亿说明:
一个列,占的字节越多,存储的范围越⼤。没必要死记,记住大致范围即可。什么时候用无符号的?比如:人的年龄,tinyint 类型无符号整型列的可选参数
理解并能应用 UNSIGNED,ZEROFILL 及 M 属性
以tinyint为例有符号:-128 ~ 127无符号:0 ~ 2551) UNSIGNED 表示无符号,列的值从0开始,不能为负数
新建一个表t2:1 -- 如果只声明TINYINT类型不给任何参数,表示有符号的,可以写负数 2 CREATE TABLE t2( 3 num TINYINT 4 ); 5 CREATE TABLE t2( 6 num TINYINT UNSIGNED 7 ); 8 -- 这个没问题 9 INSERT INTO t2 VALUES(240);10 -- 这个就会报错11 INSERT INTO t2 VALUES(-120);
2)zerofill 适合用于 学号,编码等,固定宽度的数字,可以用 0 填充至固定宽度
1 -- 改变表t2添加sn列,属性是tinyint(5)位,不足5位用0填充到5位2 ALTER TABLE t2 ADD sn TINYINT(5) ZEROFILL;
注意:填写了ZEROFILL属性后不用使用UNSIGNED进行无符号声明,因为碰到需要填充0的数字,生
活中根本没有负数的。查看表结构使用DESC1 DESC t;
我们可以看出,插入的sn列,已经为UNSIGNED类型
3)关于TINYINT类型的后⾯括号中的5(M)
因为INTYINT类型本身就是有范围的,所以这个括号以后的值,如果没有ZEROFILL声明填充,这个值根本没有作用,这个值就是为了跟ZEROFILL做配合使用的。1 -- 规定好所谓的TINYINT(1)位2 Alter table t2 ADD m TINYINT(1) UNSIGNED;3 -- 填写一个三位的100,还是可以添加成功4 INSERT INTO t2(m) values(100);
浮点列与定点列
FLOAT:浮点型,单精度浮点型
DOUBLE:范围更大的浮点型,双精度浮点数DECIMAL:定点型,无精度损失范围:
float -3.402823466E+38 到-1.175494351E-38、 0 和 1.175494351E-38 到 3.402823466E+38。 这些是理论限制, 基于 IEEE 标准。 实际的范围根据硬件或操作系统的不同可能稍微小些。 double 更大,没必要去记忆他们的范围,除非搞天文 。FLOAT(M,D) DOUBLE(M,D)
整型的M遇到ZEROFILL才会起作用。FLOAT的M和D只要设置了,立马就起作用。M 是精度,总位数。D 标度, 小数点后面的位数 。测试:FLOAT(5,2)1 create table t4( 2 money float(5,2) 3 ); 4 5 6 -- 报错 7 insert into t4 values (9999); 8 -- 正常 9 insert into t4 values (999.99);10 -- 报错11 insert into t4 values (1000);12 -- 正常13 insert into t4 values (-999.99);14 -- 报错15 insert into t4 values (-1000);
DECIMAL(M,D) 定点型
更加精准,无精度损失测试:1 CREATE TABLE t5(2 f FLOAT(9,2),3 d DECIMAL(9,2)4 );5 -- 仔细观察插入的同样的数据,查询出来的结果6 INSERT INTO t5 VALUES (1234567.23,1234567.23);7 -- 一个小数点是25 另一个是23
我们可以清晰的看到,f列,我们插入的数据跟显示的数据是不同的。
float/double , 有精度损失。decimal 定点型,更精确。定点型,是将整数部分和小数部分分别用数字来存储的,所以定点型更精确 。字符型列
字符型:
CHAR VARCHAR TEXT/BLOB ENUMCHAR 定长存储内容VARCHAR 变长存储内容1. CHAR和VARCHAR有什么区别呢?
CHAR(M),VARCHAR(M)都设置10个字符的宽度1)定长的CHAR(10),是固定的长度给定列10个字符的宽度,最多能存10个字符哪怕你就是写一个字符,它也站10个字符,就好比你去吃自助餐,给了100块钱,吃多吃少都得花100。2)变⻓的VARCHAR(10),是可变长度
给定列10个字符的宽度,最多也能存10个字符,多了也存不了比如说给1个字符的宽度,用多少占多少,利用率是否是100%?当然不是,那就没有CHAR类型的必要了。它会在每一个10个长度的前面添加1-3个字符作为提示信息,用于提示后面还有多少个长度,需要占空间的2. 那到底是选择CHAR还是VARCHAR呢?
现在磁盘容量都非常的大,如果存储的字符不是很多,比如20个字符以内,其实都用CHAR,速度会更快,像微博那样的,用的就是VARCHAR,因为它被限定在140个字符,而且还是可变的140。3. char没有存够指定的长度,也能占据指定的长度,是如何做到的呢?
char 不够指定长度时用”\0”(空格)来填充,取出时,会把右侧的空格全部抹掉。注: 这意味着,如果右侧有本身有空格,将会丢失。实验测:1 CREATE TABLE t6(2 n1 CHAR(10),3 n2 VARCHAR(10)4 );5 INSERT INTO t6 VALUES (' hello ',' hello ');6 SELECT * FROM t6;7 -- CONCAT()函数,内容拼接函数,可以自由往字段中添加值8 SELECT CONCAT('!',n1,'!'),CONCAT('!',n2,'!') from t6; -- 会发现CHAR类型后面的空格消失了。
所有的空格都一样,mysql无法区分这是你本身的空格,所以char在取出时,将右侧的空格给删除掉
了。而varchar型则不会删除后面本身的空格,因为在它的开始处有1-3个字节已经说明了这个列占几个字符。注意: char(M),varchar(M),限制的是字符,不是字节
即 char(2) charset utf8,能存2个utf8字符,比如'中国'4. char/varchar 最大可存多少个字符:CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。VARCHAR列中的值为可变长字符串。长度也可以随便写,但不能超过手册规定的字节数
也就是说,虽然手册中写的是0到65535个字节,但规定的是范围是字节数,而参数里写的是字符数。比如:VARCHAR(100) ---> 就表示可以写100个汉字,但实际的最大支持肯定到不了65535,因为汉字utf8编码一个汉字占3个字节,最大长度也就是21845,而GBK一个汉字占2个字节,最大到32766。文本类型
TEXT(M)
可以存比较大的文本段,搜索速度稍慢。因此,如果不是特别大的内容,建议用char,varchar来代替。最大长度为65,535(2^16–1)字符的TEXT列。1 CREATE TABLE t8 (2 te TEXT3 );4 -- 添加字符串到t8中,最大长度65535个字符,比VARCHAR大,但速度慢5 INSERT INTO t8 values ('asdf asd fsdwerdsf ');6 SELECT * FROM t8;
BLOB(M)
⼆进制类型其实,如果不是存图像,blob基本用不上blob是用来存储图像,音频等二进制信息但实际开发我们会选择本地存储图像音频等,而不是在数据库存储,数据库只存一个路径。ENUM('v1','v2',....)
枚举类型是定义好,值,就在某一个枚举范围内,它是个单选值。比如说定义两个值 (‘boy’,’girl’) ,INSERT 时,只能选”boy”,”girl”1 CREATE TABLE t10 (2 gender ENUM ('boy','girl')3 );4 INSERT INTO t10 VALUES ('girl');5 INSERT INTO t10 VALUES ('xxx');6 INSERT INTO t10 VALUES ('boy');
SET 集合类型
它是一个设置, 字符串对象可以有零个或多个值, 每个值必须来自列值'value1', 'value2', ...SET列最多可以有64个成员,它是多选值。限制太多,一般很少用。SET内的数据顺序是由列表顺序决定的不可以插入非SET中定义好的值不可以修改已经使用过的值不可以使用重复值