博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL表类型
阅读量:6082 次
发布时间:2019-06-20

本文共 4998 字,大约阅读时间需要 16 分钟。

创建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,text
3.日期时间类型 2012-12-13 14:26:23(略。。。。。

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

时间戳,而不是MYSQL的。

整型

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 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的数字,生

活中根本没有负数的。
查看表结构使用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 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 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 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中定义好的值
不可以修改已经使用过的值
不可以使用重复值

 

转载于:https://www.cnblogs.com/zhony/p/10210793.html

你可能感兴趣的文章
DBNULL和NULL
查看>>
Confluence 6 有关 AD 的一些特殊说明
查看>>
linux系统管理之五:开机、关机、服务状态及系统密码修改
查看>>
Windows环境下的NodeJS+NPM+Bower安装配置
查看>>
LeetCode:Valid Number - 判断字符串中内容是否为数字
查看>>
Android 4.0 硬件加速
查看>>
Windows XP与NTP服务器自动更新时间的调整
查看>>
我的友情链接
查看>>
ubuntu 主机ssh root solaris虚拟机时候,输入密码报错 public key解决
查看>>
Silverlight和服务器端通信
查看>>
cookie注入&中转注入笔记
查看>>
跟Howard学LESS之初见LESS
查看>>
wap网页图片适配解决方案
查看>>
小菜学Chromium开发(一)OpenGL学习
查看>>
注解入门
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
【MySQL】online ddl 工具之pt-online-schema-change
查看>>
关于docker 容器中的时间同步
查看>>
centos,epel,repoforge三个镜像源
查看>>