mysql数据类型

## 1.数据类型 #####

1.1 文本 MySQL 5.0之前的版本char(10)或varchar(10)表述的是10个**字节** 1英文 = 1字节 可以存储10个英文 1汉字 = 2字节(GBK)/3字节(utf-8) 可以存储5个汉字(GBK)/3个汉字(utf-8) MySQL 5.0之后的版本char(10)或varchar(10)表述的是10个**字符** 1英文 = 1字符 可以存储10个英文 1汉字 = 1字符 可以存储10个汉字 ######

1.1.1 char 固定文本 将“学生姓名”列设置为char(10) - 表示可以支持最多10个字符 此时将“Tom”存入“学生姓名”中,实际上存了10个字符 可以理解存储的是"Tom"加7个空格。如果名字长度超过10个,无法存入数据。

 1.1.2 varchar 可变文本(重要) 将“学生姓名”列设置为varchar(10) - 表示可以支持最多10个字符 此时将“Tom”存入“学生姓名”中,实际上存了3个字符 。如果名字长度超过10个,无法存入数据。 **推荐使用varchar类型作为文本数据的类型**, 优点: * 数据在存储中不会有多余的冗余部分(主要指的是填满长度的空格) * 数据准确性,"Tom"和"Tom+7个空格"不是一样的数据 #####

1.2 数值

1.2.1 int 整数类型(重要) int类型支持数据为整数性质

1.2.2 float 浮点数类型(小数)(重要) float类型支持数据为浮点数性质

1.3 时间

1.3.1 date 日期类型(年月日)(重要) 可以存储“年-月-日”的时间

1.3.2 time 时间类型(时分秒) 可以存储“时:分:秒”的时间

1.3.3 datetime 日期时间类型(年月日时分秒)(重要) 可以存储“年-月-日 时:分:秒”的时间

1.3.4 timestamp 时间戳类型(了解) 在Java体系中,时间原点是1970年1月1日 8时0分0秒 GMT+8。时间戳就是表述时间与时间原点之间的所经过毫秒数(1s = 1000ms)

1.4 其他(了解)

1.4.1 blob 字节流类型(二进制数据) 将二进制文件(图片,声音....)的内容存入blob * 一般二进制文件占用的空间比较大,存储这种文件可能会拖慢数据库的执行速度*

1.4.2 boolean 逻辑类型("真"和"假") 通常情况下使用int类型替代boolean类型 int中认为 0-假 1-真 ### 2.创建表 建表至少需要提供表名,列名和列的数据类型 这些名字的命名规则: * 不能使用中文,只能英文和数字,不能以数字开头 * 名字中间不允许出现空格 * 不要使用SQL中的关键字 * 不能使用已有的名字 命名规范 * 使用英文单词进行命名 语法 ``` CREATE TABLE 表名 ( 列1名 列1的数据类型, 列2名 列2的数据类型, ... 列n名 列n的数据类型 );

3.约束 约束在表中对数据输入的限制,保证数据录入的准确性

3.1 主键约束 Primary Key(重要)

作用: 非空并且唯一 被主键约束修饰的列,具有唯一性,可以代表一行数据

比如 ![image](//upload-images.jianshu.io/upload_images/15606715-cf3d11e82a516289.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/373/format/webp)

编号具有体现某行数据的唯一性,可以代表这一行数据 主键约束的规则 * 一张表中最多只能有一个主键约束 * 做为主键的列,其中的数据不能是Null * 一个主键约束可以作用在多个列上,叫做“联合主键” *多个列组成一个主键,这些列数据的组合作为主键出现 *

![image](//upload-images.jianshu.io/upload_images/15606715-ca79919884db906f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/961/format/webp)

*面试题* *一张表最多只能有一个主键约束* √ * 一张表中最多只能有一个列是主键约束* x 主键约束的规范 * 不使用有实际意义的数据做为主键列,因为实际意义的列可能发生改动 创建主键的两种方式 * 建表时声明主键约束 创建表时,直接在主键列后进行primary key进行声明 列级声明:

 ``` CREATE TABLE haha( hid INT(8) PRIMARY KEY, hname VARCHAR(32), birthday DATE ); ``` 表级声明: 创建sno和cno为联合主键的表 ``` CREATE TABLE stu_course( sno INT(8), cno INT(8), score INT(4), PRIMARY KEY(sno,cno) ); ``` ``` CREATE TABLE haha( hid INT(8), hname VARCHAR(32), birthday DATE, CONSTRAINT PK_HAHA PRIMARY KEY(hid) );

``` * 建表后追加主键约束 为student表的sno列添加主键约束 ``` ALTER TABLE student ADD PRIMARY KEY(sno);

 3.2 外键约束 Foreign Key 一张表的某个数据来源于另一张表,这就形成了外键关系 班级表

![image](//upload-images.jianshu.io/upload_images/15606715-278698916ebbf31a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/147/format/webp) 学生表 ![image](//upload-images.jianshu.io/upload_images/15606715-00e12f290d9fcb3c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/207/format/webp)

学生表中cno的数据应该来源于班级表的cno主键,形成外键关系 学生表中cno列依赖于班级表的cno列 为学生表(student)追加外键约束 ``` ALTER TABLE student ADD FOREIGN KEY(cno) REFERENCES classes(cno) ```

创建学生表(Student)直接设置外键,只有表级声明 ``` CREATE TABLE student( sno INT(8) PRIMARY KEY, sname VARCHAR(32), cno INT(8), FOREIGN KEY(cno) REFERENCES classes(cno) );

3.3 唯一约束 Unique 被唯一约束修饰的列,其中数据不允许出现重复 唯一约束的特点(与主键约束的不同点) * 一张表中可以有多个唯一约束 * 唯一约束的数据中可以有null *主键约束与唯一约束的区别* 添加唯一约束的语句 列级声明

``` create table student( sno INT(8) primary key, sname VARCHAR(32) unique, ); ``` 表级声明 ``` create table student( sno INT(8), sname VARCHAR(32), primary key(sno), unique(sname) );

3.4 非空约束 Not Null 约束数据不能为null 列级声明

``` create table student( sno INT(8) primary key, sname VARCHAR(32) unique not null, );

3.5 检查约束 Check(MySQL不支持 Oracle支持) 自定义规则 比如约定某个整数类型的列输入的数字不能小于0 check(xxx > 0) check(score >= 0 and score <= 100)

*笔试题:写出五种数据库的约束,各自进行解释?* ###

4.维护表 #####

4.1 删除表 **删除表时一定要事先确认** 不仅仅删除的是表中的数据,表结构(表自身)都被删除了 ``` drop table 表名; ``` #####

4.2 截断表(清空表中的数据) 清空表中的数据,保留表结构(表自身) ``` truncate table 表名; ``` *面试题* *- drop和truncate的区别?

* *答 drop时删除整张表,包含表结构;truncate是截断表,保留表结构,数据无法恢复* #####

4.3 更改表名 将表student2更名为student3 ``` ALTER TABLE student2 RENAME student3 ``` #####

4.4 更改列名和列的数据类型 更改student3表中的sname列为snamex,同时列的数据类型varchar(64) ``` ALTER TABLE student3 CHANGE sname snamex VARCHAR(64); ``` #####

4.5 增加列 为student3表新增birthday列,列的数据类型是date类型 ``` ALTER TABLE student3 ADD COLUMN birthday DATE ``` #####

4.6 删除列 删除student3表中birthday列 ``` ALTER TABLE student3 DROP COLUMN birthday ```

** 本章重点**

 1. 表的概念

2. 各种约束的概念

3. 主键约束的一些细节(联合主键)

4. 主键和唯一的区别

5. drop和truncate的区别

你可能感兴趣的:(mysql数据类型)