一、关系型数据库代替普通文本?
- 关系数据库比普通文件的数据访问速度更快
- 关系数据库更容易查询并提取满足特定条件的数据
- 关系数据库具有专门的内置机制处理并发访问。
- 关系数据库可以提供对数据的随机访问
- 关系数据库具有内置的权限系统
二、MySQL的基本安装
- 安装文件
- 创建一个操作数据库的用户
- 设置数据保存路径
- 自启动MySQL服务器
三、MySQL的数据类型
1,数据类型 - 数值型
a) 整型
数据类型 | 含义(有符号) |
---|---|
tinyint(m) | 1个字节 范围(-128~127) |
smallint(m) | 2个字节 范围(-32768~32767) |
mediumint(m) | 3个字节 范围(-8388608~8388607) |
int(m) | 4个字节 范围(-2147483648~2147483647) |
bigint(m) | 8个字节 范围(+-9.22*10的18次方;2的63次方减一) |
取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。
b) 浮点型
数据类型 | 含义 |
---|---|
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位
c) 定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值
decimal(m,d) //参数m<65 是总个数,d<30且 d<m 是小数位
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。 在今后关于浮点数和定点数的应用中,大家要记住以下几点: 1、浮点数存在误差问题; 2、对货币等对精度敏感的数据,应该用定点数表示或存储; 3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较; 4、要注意浮点数中一些特殊值的处理。
实验
1、先创建一个表test都用了float ,decimal 和double;(10,2) 2、插入一条数据查看发现没有发现精度丢失问题(12345.66) 3、再插入一条数据,发现精度损失(131072.32) 4、插入小数的位数多的话会进行四舍五入,不会给出警告或者插入不进去的情况:(13107,332) 5、插入位数多点的,发现float精度损失更加严重而decimal精度没有损失(12345678.66)
d)字符串(char,varchar,text)
MySQL数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
varchar(n) | 固定长度,最多65535个字符 |
tinytext | 可变长度,最多255个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
enum | 枚举 |
- char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用什么trim之类的函数去过滤空格。
- varchar:存储变长数据,但存储效率没有CHAR高,必须在括号里定义长度,可以有默认值。保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。
- text:存储可变长度的非Unicode数据,最大长度为2^31-1个字符。text列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。
所以:
- 经常变化的字段用varchar;
- 知道固定长度的用char;
- 尽量用varchar;
- 超过255字节的只能用varchar或者text;
- 能用varchar的地方不用text;
- 能够用数字类型的字段尽量选择数字类型而不用字符串类型的(电话号码),这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
e)日期时间类型
数据类型 | 含义 |
---|---|
date日期 | 2008-12-2 |
time时间 | 12:25:36 |
datetime | 日期时间 '2008-12-2 22:06:44' |
timestamp | 自动存储记录修改时间(时间戳) |
四、数据类型的属性
MySQL关键字 | 含义 |
---|---|
NULL | 数据列可包含NULL值 |
NOT NULL | 数据列不允许包含NULL值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET name | 指定一个字符集 |
五、数据类型的显示宽度和零填充
1、整型的显示宽度
tinyint(2) 2显示宽度
默认 区间 -128 ~ 127
无符号 0~255
零填充:插入数据的宽度低于设置宽度的时候,自动补前导零
insert into tmp values(1),(12),(123),(1234);
alter table tmp modify id tinyint(2) zerofill;
2、字符类型显示宽度
varchar(10) 望字段插入数据,只能保存10个字符的数据,其他的被丢掉
那么mysql中,char(M)这个M单位到底是字节还是字符呢,在不同的编码下测试为:
- utf-8编码 1charactor(字符)=3bytes(字节),1个汉字又等于1charactor 当我们设置varchar(100)的时候即可以存储100个汉字又可以写入100个字母
- gbk编码 1charactor(字符)=2bytes(字节),1个汉字也等于1charactor 当我们设置varchar(100)的时候即可以存储100个汉字又可以写入100个字母
- latin1编码 1charactor(字符)=1bytes(字节),1个汉字也等于2charactor 当我们设置varchar(100)的时候可以存储100字母确只能写入50个汉字