一、数据类型
我们在设计表格的时候,要注意每个字段适合使用哪些数值类型,选择不合适的话会对表格数据难以管理,数据保存不够精确而造成严重影响。
一个英文字母,占1个字节
1个汉字,utf8编码,占3个字节
1、数值类型
类型 | 注解 |
int | 4字节,范围(-2147483648~2147483647) |
tinyint | 1字节,范围(-128~127) |
smallint | 2字节,范围(-32768~32767) |
mudiemint | 3字节,范围(-8388608~8388607) |
bigint | 8字节,范围(+-9.22*10的18次方) |
bit | 一字节,只能表示0/1 |
float(m,d) | 4字节,单精度浮点型,m总个数,d小数位 |
double(m,d) | 8字节,双精度浮点型,m总个数,d小数位 |
decimal(m,d) | decimal是存储为字符串的浮点数,用于存储较为精确地数据场景(如:银行) |
2、字符串数值类型
类型 | 注解 |
char | 固定长度,最多255个字符 |
varchar |
可变长度,最多65535个字符 |
text | 可变长度,最多65535个字符 |
blob | 可变长度,BLOB字段用于存储二进制数据(如:照片) |
enum(枚举) | 可变长度,保存字符数据。最多包含65535个不同的成员。当定义了一个enum的列时,该列的值限制为列定义中声明的值。如果列声明包含NULL属性,则NULL将被认为是一个有效值,并且是默认值。如果声明了NOT NULL,则列表的第一个成员是默认值 |
set | 可变长度,插入数据的时候,必须是集合里有的内容,如果没有,就会报错,不能插入,而且插入重复 |
binary | 当为列指定了该属性时,将以区分大小写的方式排序。 |
(1)char和varchar有什么区别?
*char 固定长度的字符串类型 character 字符 --》在存储的时候,不够固定长度,就在前面填充空格,达到固定长度。
'wang' 在表结构里的长度是30,在存储wang字符串的时候,会在前面填充26个空格来达到30个字符的长度
*varchar 可变长的字符串类型 variable character
'wang' 我的结构里的长度是4,因为varchar字符串类型只是存储相应的字符,不会额外使用其他空间。
char比varchar在长度没有达到规定的时候,更加消耗磁盘空间。如果达到了规定长度,varchar要比char多一个字节的存储空间
长度方面:
char 最大长度255 varchar最大长度是65,535
检索方式:
一个长度char列被固定在创建表声明的长度。长度可以是0到255之间的任何值。char存储值时,将在它们的右边填充空格以达到指定的长度。当CHAR被检索到的值,拖尾的空格被删除。
虽然varhcar数据类型可以节省存储空间,提高数据处理的效率。但是其可变长度带来的一些负面效应,有时候会抵消其带来的优势。
char存储定长数据很方便,char字段上的索引效率很高。
char类型的数据在存取的时候比varchar要快?
由于char是固定长度的所以计算机处理char的速度比varchar快很多。
二、字段属性
类型 | 属性 |
zerofill | 填充 0 |
unsigned | 无符号整数 |
signed | 有符号整数 |
not null | 不能为空 |
auto_increment | 自增 |
foreign key | |
primary key | 等同于not null+unique,不允许为空,而且也不需要重复 |
comment | |
default | 默认值 |
unique | 唯一性 |
添加数据类型
(1)zerofill :填充0 ,影响数字显示方式。
create table t1(id int(5) zerofill);
# 创建t1表格,字节为int类型不超过五位数,不到五位数的前面用零填充。
(2)auto increment:自动增长,只适用于整数类型
# id int unsigned atuo_increment primary key 设id为int数据自动增长类型,不允许为空。
# name varchar(20)not null 设置第二个字段为varchar数据类型设置20个字段,且不能为空。
*这样分别设置名字不设置id则id会根据设置的value而自动增长。
字段约束
对于某个字段里面的内容进行限制
set 是mysql里设置变量的命令
@@ 开头的变量是内置的变量
@ 开头的是自定义的变量
@@auto_inc
root@nongda 10:00 mysql>set @sg='wang'; #定义变量sg赋值给wang
Query OK, 0 rows affected (0.00 sec)
root@nongda 10:00 mysql>insert into t2(name) values(@sg); #应用sg的值插入表t2中去。
Query OK, 1 row affected (0.01 sec)
root@nongda 10:01 mysql>select * from t2;
+----+-------+
| id | name |
+----+-------+
| 1 | Marry |
| 2 | Bob |
| 3 | lin |
| 4 | wang |
+----+-------+
4 rows in set (0.01 sec)
# 这样wang就直接插入到t2中去了。
rement_offset 起始偏移的值
offset 偏移
@@auto_increment_increment 每次增长多少的变量