mysql表类型_MySQL表类型

创建table表

别人给我们建好了表,我们可以增删改查数据,特别是查询,变化非常大。

如果别人没有把表给我们,我们连上数据库,要自己建一张表,根据项目的要求,做一个博客,一

个商城,具体分析这个商城项目应该如何建表。

如何建一张表?

b040665a0cd9910c3ec3f85ed847aba4.png

我们把表头声明完之后,表就已经声明好了;

所谓建表的过程 ---> 就是声明表头的过程;

表头的第一行 ---> 我们叫做列,里面起的名字,我们叫 列名

拿到数据中来说: 我们建表的过程 => 就是 声明列 的过程;

建立以个简单的表:

1 CREATE TABLEt1(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,text

3.日期时间类型 2012-12-13 14:26:23(略。。。。。

一般存储注册时间,商品发布时间等,并不是用datetime存储,是用时间戳,且用的还是PHP的

时间戳,而不是MYSQL的。

)

整型

710757a90a817375a6cd86f3a157a2c8.png

mysql 利用的是字节来表示范围和宽度的。

之前创建过一个表,是int类型的,占4个字节。

1个字节有8个位,每一个位上都有0、1两种可能。

0000 0000

那4个字节int类型在磁盘中比如说存放1这个数字,存法如下:

00000000 00000000 00000000 00000001

int类型存储的范围是多少能不能算出来?

11111111 11111111 11111111 11111111

2的32次方-1大概是42亿

说明:

一个列,占的字节越多,存储的范围越⼤。

没必要死记,记住大致范围即可。

什么时候用无符号的?

比如:人的年龄,tinyint 类型无符号

整型列的可选参数

理解并能应用 UNSIGNED,ZEROFILL 及 M 属性

以tinyint为例

有符号:-128 ~ 127

无符号:0 ~ 255

1) UNSIGNED 表示无符号,列的值从0开始,不能为负数

新建一个表t2:

1 --如果只声明TINYINT类型不给任何参数,表示有符号的,可以写负数

2 CREATE TABLEt2(3 num TINYINT

4 );5 CREATE TABLEt2(6 num TINYINTUNSIGNED7 );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的数字,生

活中根本没有负数的。

查看表结构使用DESC

1 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 tablet4(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 TABLEt5(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 ENUM

CHAR 定长存储内容

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 TABLEt6(2 n1 CHAR(10),3 n2 VARCHAR(10)4 );5 INSERT INTO t6 VALUES ('hello','hello');6 SELECT * FROMt6;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 TABLEt8 (2 te TEXT

3 );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 TABLEt10 (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中定义好的值

不可以修改已经使用过的值

不可以使用重复值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值