什么是数据库?数据库是用来存储数据的程序。
为什么要学习数据库?现代软件应用开发中,数据基本都是存储在数据库中,操作数据库是程序员的基本技能。
数据库类型有哪些?数据库有关系型数据库和非关系型数据库.
操作MySQL数据库的语句
使用CREATE DATABASE命令创建数据库,并可指定数据库编码。
sql
CREATE DATABASE `school` DEFAULT CHARACTER SET = `utf8`;
使用DROP DATABASE命令删除数据库。删除数据库需要谨慎!
sql
DROP DATABASE `school`;
使用USE命令切换数据库。
sql
USE `school`;
操作MySQL数据表的语句
MySQL数据库列的数据类型
MySQL可以存储的数据类型非常丰富,可分为:数值类型、字符串类型、日期类型、二进制类型、其他类型。
数值类型
MySQL数据库可以存储整数、浮点数和定点数(精确存储的小数)。
整数类型
其中整数数据类型,类似于Java中的整数数据类型,可以有多个字节存储不同数据范围的整数。
- TINYINT:使用一个字节存储的整数数据类型,类似于Java中的byte,可以表示2的8次方个整数,有符号整数的范围为:-128127。但是,由于数据库可以设置表示无符号数,因此TINYINT可表示的无符号整数的范围为:0255。
- SMALLINT:使用两个字节存储的整数数据类型,类似于Java中的short,可以表示2的16次方个整数,有符号整数的范围为:-32,768至32,767,无符号整数的范围为:0至65,535。
- MEDIUMINT:使用三个字节存储的整数数据类型,而Java中没有使用三个字节存储的整数类型。MEDIUMINT用三个字节,则可以表示2的24次方个整数,有符号整数的范围为:-8,388,608至8,388,607,无符号整数的范围为:0至16,777,215。
- INT(别名为INTEGER):使用四个字节存储的整数数据类型,类似于Java中的int,可以表示2的32次方个整数,有符号整数的范围为:-2,147,483,648至2,147,483,647,无符号整数的范围为:0至4,294,967,295。 就像Java中,int是最常用的整数数据类型,MySQL数据库中,INT也是最常用的整数数据类型。
- BIGINT:使用八个字节存储的整数数据类型,类似于Java中的long,可以表示2的64次方个整数,有符号整数的范围为:-9,223,372,036,854,775,808至9,223,372,036,854,775,807,无符号整数的范围为:0至18,446,744,073,709,551,615。
浮点数和定点数
MySQL数据库存储浮点数,类型与java相同,都是非精确的小数。
- FLOAT:使用4个字节存储的单精度浮点数类型,精确到小数点后7位左右
- DOUBLE:使用8个字节存储的双精度浮点数类型,精确到小数点后15位左右
Java中如果要精确表示小数,需要使用BigDecimal类。MySQL也有用于存储精确小数的类型,叫DECIMAL,是使用经过格式化的字符串存储小数。
字符串类型
短文本
- CHAR:定长字符串。长度固定M个字符(不是字节)。M由长度Length指定,最长255。CHAR类型在定义完长度后(比如255),MySQL会为每一个记录(每一行)的该列预留固定长度的存储空间。无论你存储的是一个字符,还是255个字符长度的字符串。如果存入的字符串不足设定字符长度,MySQL会在右侧用空格填充到指定长度,查询时会自动移除空格。
- VARCHAR:变长字符串,存储的字节大小是跟设置的最长长度有关。长度可变化,最多M个字符。M由长度Length指定,最多65535。VARCHAR与CHAR不同,CHAR是每一行的该列是固定长度的存储空间,而VARCHAR是每一行的该列存储空间,与该列存储的实际字符串长度有关(实际字符数 + 长度标识(1~2字节)的空间)。比如字符串"A"存储到CHAR(255),这一行的这一列所需存储空间为:
255 * 4字节(以UTF-8编码为例),约为1020个字节。而字符串"A"存储到VARCHAR(255),这一行的这一列所需存储空间约为 1 字符的字节数 + 长度标识(如 1+1=2 字节)。
因此,CHAR类型适合固定长度或者长度偏差不大的字符串存储,比如MD5哈希值,定长的邮编等,而不适合不固定长度、或者长度偏差大的字符串,因为这会严重浪费存储空间。但是,CHAR类型也有一定优势,相对VARCHAR来说,固定长度的好处是不用频繁计算偏移值,在读写速度上会快很多。
综上,VARCHAR是最常用的短文本字符串的数据类型。虽然VARCHAR是变长字符串,存储的空间与实际存储的字符串长度有关,但是也不意味着不设置长度Length,或者设置较长的Length(比如65535)。因为使用长度Length,可以限制写入的字符串长度,可以在很多应用场景使用。比如,用户名可设置最长20个字符。另外,考虑到存储效率和性能,也需要设置合理的长度length。
长文本
与整数类型相似,MySQL提供多种类型的长文本。与短文本CHAR和VARCHAR是行内存储不同,长文本存储是行外存储,相当于只存了一个指向外部文本存储的指针。因此,长文本IO效率不如短文本。由于现代开发中,大文本存储一般用对象存储,而很少用关系型数据库存储,因此,长文本字符串使用率并不高。
- TINYTEXT:最大长度为255个字符,与CHAR(255)和VARCHAR(255)在字符数上有重叠,但是一般推荐使用VARCHAR。
- TEXT:最大长度为65,535个字符,与VARCHAR(65535)在字符数上有重叠,但是一般推荐长文本使用TEXT。
- MEDIUMTEXT:最大长度为16,777,215个字符。
- LONGTEXT:最大长度为4,294,967,295个字符(约4GB)
日期和时间类型
- DATE:存储日期,格式是
YYYY-MM-DD。 - TIME:存储时间,格式是
HH:MM:SS。 - DATETIME:存储日期和时间,格式是:
YYYY-MM-DD HH:MM:SS。 - TIMESTAMP:存储时间戳(从'1970-01-01 00:00:01' UTC 到现在的秒数)。与时区相关,存入和查询时会根据会话时区进行转换。
二进制类型
- BINARY:定长二进制,存储最大255个字节(最大存储量由Length限制)。
- VARBINARY:变长二进制,存储最大65535个字节。
其他类型
ENUM:枚举类型,值必须从预定义的列表中选择一个。例如ENUM('small', 'medium', 'large')。SET:集合类型,可以从预定义的列表中选择零个或多个值。JSON(MySQL 5.7+):专门用于存储JSON格式的数据,并提供了一系列JSON查询函数。
MySQL数据库列的数据类型长度(Length)
MySQL的数据类型长度(Length)是一个重要但容易混淆的概念,不同数据类型的长度含义不相同。
数值类型
整数类型
整数类型包括使用不同字节存储的整数类型:INT(4字节)、TINYINT(1字节)、SMALLINT(2字节)、MEDIUMINT(3字节)、BIGINT(8字节)
整数类型+是否无符号数Unsigned,就已经确定了这个字段存储的数据范围。因此,整数类型的长度,是表示显示宽度,仅影响显示格式,而不会影响存储范围。
长度(Length)与填充零(zerofill)一起使用时,当数值位小于设置的长度,则在左侧填充0。比如:Length为5,zerofill为true时,若改字段值存储为3,则会显示00003。当数值位大于设置的长度,则还是会显示值原本的长度。比如:Length为5,zerofill为true时,若改字段值存储为123456,则会显示原本的值123456。
如果不指定长度,则使用默认的显示宽度。其中INT类型的默认显示宽度为11(有符号)或10(无符号),其他整数类型也有默认的显示宽度,不再赘述。
MySQL8.0+已经将填充零(zerofill)属性标记为弃用,因为zerofill仅对查询时的显示生效,实际开发中有更多更好的方式达到相同效果(比如用格式化输出)。因此,整数类型的Length属性不需要再设置。
浮点数类型
浮点数类型包括使用4字节存储的单精度浮点数FLOAT和8字节存储的双精度浮点数DOUBLE,浮点数都是具有一定精度的不精确小数。
与整数相似,浮点数类型的长度(Length)参数并不是指存储的字节数,而是用于指定显示宽度。
MySQL 8.0+ 建议直接使用
FLOAT/DOUBLE而不指定长度
定点数
定点数的特点是精确存储,不像浮点数有精度误差。定点数存储是按照整数部分和小数部分分别存储。
定点数不像整数和浮点数的特定数据类型,并没有确定需要使用多少字节存储,因此需要根据指定定点数长度再来确定需要支持精确存储这么多长度的定点数的字节数,。具体来说,需要在Length字段输入M,D格式的两个参数,中间用逗号分隔。其中M代表定点数总位数,D代表定点数的小数位数。比如设置为"10,2",即表示定点数支持存储10位的小数,支持小数点后2,支持存储数据范围为:0.00~99999999.99。
字符串类型
短文本
短文本字符串类型有等长字符串CHAR和变长字符串VARCHAR,长度Length都是设置字符串的最长长度。
CHAR的最长长度为255个字符,即长度Length设置的范围为1~255。
VARCHAR的最长长度为65535个字符,即长度Length设置的范围为1~65535。但是一般不推荐使用VARCHAR存储长文本,考虑到检索和内存效率,推荐使用与VARCHAR长度重叠的TEXT存储长文本,或者使用可存储更长文本的MEDIUMTEXT和BIGTEXT存储长文本。
长文本
TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT代表存储不同最大字符串长度的长文本,这些长文本类型在定义时不需要也不允许指定长度限制。
MySQL数据库列的字段约束
MySQL的列或者字段在创建时,除了需要选择字段类型,还需要设置字段的一些约束,这些约束又被称为列修饰符。列约束和列的数据类型,共同定义了列的完整特征。
字段约束可以分为两大类:通用字段约束和特有数据类型的字段约束。
通用字段约束
- NULL / NOT NULL:是否允许存储NULL,NULL是指没有值。
- DEFAULT value:设置字段的默认值,即未设置改字段值时,默认存储的值。当字段允许存储NULL时,可以设置字段默认值为NULL(即默认没有值)。
- COMMENT:为字段的注释。可以为每一个表字段添加注释。
- PRIMARY KEY:标记为主键。
- UNIQUE:确保字段值唯一。
数值类型特有字段约束
- UNSIGNED:无符号整数。勾选之后,该整数类型就只能存放非负数。与此同时,整数存储的范围也会加倍。比如INT类型的有符号整数的范围为:-2,147,483,648至2,147,483,647,无符号整数的范围为:0至4,294,967,295。
- AUTO_INCREMENT:自动递增。勾选之后,数值会自动递增。由于自动递增的前提,是之前的记录的这个字段值存在,并且自动递增后值肯定不同。所以,能设置AUTO_INCREMENT的限制:(1)必须是整数类型(
INT,BIGINT,SMALLINT,TINYINT,MEDIUMINT);(2)必须是主键或唯一键(PRIMARY KEY或UNIQUE KEY);(3)必须不允许null(not allow null) - ZEROFILL:零填充显示。仅在查询结果时补0。注意:MySQL 8.0+ 中标记为弃用,不应在新项目中使用。
字符串类型字段约束
MySQL在定义字符串类型(长文本、短文本)需要设置文本编码,包括字符集(Character Set)和排序规则(Collation)。
- 字符编码encoding:现代开发中都推荐使用utf8mb4,支持所有 Unicode 字符(包括表情符号),需要4字节存储
- 排序规则collation:推荐使用 utf8mb4_unicode_ci