赞
踩
DDL(Data Definition Language)语句: 数据定义语言
,主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等。
字符集规定了字符在数据库中的存储格式,比如占多少空间,支持哪些字符等等。不同的字符集有不同的编码规则,在有些情况下,甚至还有校对规则的存在。在运维和使用MySQL数据库中,选取合适的字符集非常重要,如果选择不恰当,轻则影响数据库性能,严重的可能导致数据存储乱码。 对MySQL8 以后来说 性能影响不大
为什么字符集会对数据库有些影响(了解):
mysql修改字符集 性能影响谈谈性能优化:Mysql 的字符集以及带来的一点存储影响...撕得粉·扔的博客-CSDN博客
查看全部字符集:
show charset;
字符集 | 长度 | 说明 |
---|---|---|
GBK | 2bit | 支持中文,但是不是国际通用字符集 |
UTF-8 | 3bit | 支持中英文混合场景,是国际通用字符集 |
utf8mb4 | 4bit | 完全兼容UTF-8,用四个字节存储更多的字符,支持emoji(表情包) |
MySQL数据库在开发运维中,字符集选用规则如下: 1、如果系统开发面向国外业务,需要处理不同国家、不同语言,则应该选择utf-8或者utf8mb4。 2、如果只需要支持中文,没有国外业务,则为了性能考虑,可以采用GBK
创建数据库。同时指定数字集
create database 库名 default charset utf8mb4
说起排序规则就离不开字符集,严格来说,排序规则是依赖于字符集的
字符集是用来定义MySQL存储不同字符的方式,而排序规则一般指对字符集中字符串之间的比较、排序制定的规则。一种字符集可以对应多种排序规则,但是一种排序规则只能对应指定的一种字符集,两个不同的字符集不能有相同的排序规则。
总结:
字符集决定了能够存储哪些字符,比如 ASCII 字符集只能存储简单的英文、数字和一些控制字符;GB2312 字符集可以存储中文;Unicode 字符集能够支持世界上的各种语言。排序规则定义了字符集中字符的排序和比较顺序,包括是否区分大小写,是否区分重音等。
查看全部字符集:
show collation;
查看mysql默认的字符编码状况
注意:在MySQL 8.0 之后 所有的默认创建库的字符集都为 utf8mb4 , 排序方式都是 utf8mb4_bin
MySQL 5.7 不指定默认字符集与排序方式 是latin1的方式
对 latin1 字符集感兴趣的 可以去这个博客简单看看,或者自行百度吧
MySQL基础知识---------Latin1_卧浪居士的博客-CSDN博客
查看排序规则
- show variables like "%character%";
- # 查询内容详解
- 1,设置客户端使用的字符集
- 2,设置链接数据库时的字符集
- 3,设置创建数据库的编码格式
- 4,文件系统的编码格式
- 5,数据库给客户端返回数据时的编码格式
- 6,服务器安装时指定的编码格式
- 7,数据库系统使用的编码格式
- 8,字符集的安装目录
排序规则 | 对于英文字符串的,大小写的敏感 |
---|---|
utf8mb4_general_ci | 大小写不敏感 |
utf8mb4_bin | 大小写敏感(存拼音,日文) |
针对已有数据库修改排序规则
alter database 库名 collate utf8mb4_bin
排序规则:
MySQL 排序规则云满笔记的博客-CSDN博客mysql排序规则选什么
MySQL字符串类型
MySQL数据类型---字符串Cat God 007的博客-CSDN博客mysql 字符串
MySQL字符串类型 | 用法 | 详解 |
---|---|---|
char | char(100) | 为定长格式,写入两个字符 剩下的98个会用空格占满 |
varchar | varchar(100) | 为变长格式,写入两个字符占一个空格 剩下的会压缩 超过255会多占两个空格 |
enum | enum(“男”,”女”,”保密”) | 字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举 |
如何选择这两个数据类型? 少于255个字符串长度,定长的列值,选择char 多于255字符长度,变长的字符串,可以选择varchar
DDL的应用
创建数据库
CREATE DATABASE test1 CHARSET utf8mb4 COLLATE utf8mb4_bin;
查看
- # 列出所有库名
- SHOW DATABASES;
- # 查看创建库的结构
- SHOW CREATE DATABASE 库名;
- # 查看所有表
- SHOW TABLES;
- # 显示创表语法和存储引擎,还有字符集
- SHOW CREATE TABLE 表名;
- # 显示表的列结构
- DESC 表名;
- # 创建一个表结构一样的表
- CREATE TABLE 表1 LIKE 表2;
删除数据库、删表 慎用
- DROP DATABASE 库名;
- DROP TABLE 表名;
索引类型 | 详解 | 用法 |
---|---|---|
主键索引 | 数据列不允许重复,不允许为NULL,一个表只能有一个主键。 | |
唯一索引 | 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引 | ALTER TABLE 表名 ADD UNIQUE (列名); 创建唯一索引 ,ALTER TABLE 表名 ADD UNIQUE (列1,列2);创建唯一组合索引 |
普通索引 | 基本的索引类型,没有唯一性的限制,允许为NULL值 | ALTER TABLE 表名 ADD INDEX 索引名 (列名);创建普通索引,ALTER TABLE 表名 ADD INDEX 索引名(列1, 列2, 列3);创建组合索引 |
主键索引 与 唯一索引的 区别只在于 能否为空 以及能否创建多个
唯一索引与普通索引的区别在于 数值可重复
查看索引创建情况
show index from 表名;
查看索引的参数说明
参数(show index from 表名;) | 详解 |
---|---|
Table | 表示创建索引的数据表名 |
Non_unique | 表示该索引是否是唯一索引。若不是唯一索引,则该列的值为 1;若是唯一索引,则该列的值为 0。 |
Key_name | 表示索引的名称 |
Seq_in_index | 表示该列在索引中的位置,如果索引是单列的,则该列的值为1;如果索引是组合索引,则该列的值为每列在索引定义中的顺序。 |
Column_name | 表示定义索引的列字段 |
Collation | 表示列以何种顺序存储在索引中。在 MySQL 中,升序显示值“A”(升序),若显示为 NULL,则表示无分类 |
Cardinality | 索引中唯一值数目的估计值。基数根据被存储为整数的统计数据计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大 |
Sub_part | 表示列中被编入索引的字符的数量。若列只是部分被编入索引,则该列的值为被编入索引的字符的数目;若整列被编入索引,则该列的值为NULL。 |
Packed | 指示关键字如何被压缩。若没有被压缩,值为 NULL。 |
Null | 用于显示索引列中是否包含 NULL。若列含有 NULL,该列的值为 YES。若没有,则该列的值为 NO。 |
Index_type | 显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE)。 |
Comment | 显示评注 |
优点:
一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
二、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
五、通过使用索引,可以在查询的过程中,使用查询优化器,提高系统的性能。
缺点:
一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。
三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度
DDL --- 表定义 重点
列属性 | 详解 |
---|---|
PRIMARY KEY | 主键约束,表中只能有一个,非空且唯一. 主键不能重复 方便查询 |
NOT NULL | 非空约束,不允许空值 |
UNIQUE KEY | 唯一键约束,不允许重复值 |
DEFAULT | 修饰符为字段设定一个默认值,一般配合 NOT NULL 一起使用 |
TINYINT | 非常小的整数(TINYINT 最大是127,那 TINYINT UNSIGNED 最大 就可以到 127 * 2) |
UNSIGNED | 该属性只能用于设置数据类型,不允许数据列出现负数。如果不需要向某字段中插入负数,则使用该属性修饰可以使用该字段的最大存储长度增加一倍。例如,正常情况下数据类型TINYINT的数值范围在 -128 ~ 127,而使用UNSIGNED 属性修饰以后最小值为0,最大值可以达到255。 |
COMMENT | 注释 |
AUTO_INCREMENT | 自增长的列 |
mysql提供了五种整型tinyint、smallint、mediumint、int和bigint:
理解mysql中的unsigned是什么意思L.Cheng的博客-CSDN博客mysql tinyint unsigned
关于日期的详细内容
MySQL8.0中的日期类数据及其函数_Sun_Sherry的博客-CSDN博客
时间类型 | 详解 |
---|---|
DATE | YYYY-MM-DD 1000-01-01 ~ 9999-12-31 |
TIME | "hh:mm:ss" 格式表示的时间值 |
datetime | 范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。 |
timestamp | 范围为从 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。 |
MySQL8 创表语句的两种写法
- CREATE TABLE test1(
- id INT NOT NULL AUTO_INCREMENT COMMENT 'ID',
- sno INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '学号',
- sName VARCHAR(20) NOT NULL COMMENT '姓名',
- sex ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性别',
- age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
- Time TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入学时间',
- -- Time DATE NOT NULL DEFAULT '1000-01-01' COMMENT '入学时间', # 注意设定默认值的时候 NOW 以及其他函数不管用
- PRIMARY KEY(id),
- INDEX(sName),
- UNIQUE(sno) # 写法误区 切勿在最后一行的时候 加逗号 !
- )ENGINE INNODB CHARSET utf8mb4 COLLATE utf8mb4_bin AUTO_INCREMENT=10;
-
- # 第二种写法
- CREATE TABLE test2(
- id INT PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT 'ID',
- sno INT UNSIGNED NOT NULL DEFAULT 0 UNIQUE COMMENT '学号',
- sname VARCHAR(255) NOT NULL INDEX COMMENT '姓名',
- age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
- gender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别',
- intime DATETIME NOT NULL DEFAULT NOW() COMMENT '入学时间'
- )ENGINE INNODB CHARSET utf8mb4 COLLATE utf8mb4_bin AUTO_INCREMENT=10;
查看表结构
- DESC test1;
- # 字段名称详解
- 1、字段名称(Field)
- 2、字段类型(Type)
- 3、字段是否为null
- 4、字段是否为主键(key)
- 5、字段的默认值(default)
- 6、Extra其他
删除索引
- drop index 索引名 on 数据表名;
- alter table 表名 drop index 索引名称; # 可以删除 除主键索引以外的其他索引
- # 注意如果自定义的索引名称 删除索引的时候需要 写自定义的名称 不然删除会失败
修改表
- # 在 年龄 后面添加 微信 列
- ALTER TABLE test1 ADD VX VARCHAR(20) NOT NULL COMMENT '微信号' DEFAULT '无' AFTER age;
- # 删除列
- ALTER TABLE test1 DROP VX;
- # 放在第一列
- ALTER TABLE test1 ADD qwe INT UNSIGNED NOT NULL UNIQUE COMMENT 'ID列' FIRST;
- # 注意 如果不加 AFTER 和 FIRST的话 默认是放在最后列
- ALTER TABLE test1 ADD ID_card INT UNSIGNED NOT NULL UNIQUE COMMENT '身份证';
-
- # 修改表字段 限制条件
- ALTER TABLE test1 MODIFY sName VARCHAR(60) NOT NULL COMMENT '名字';
- # 更改表字段名字
- ALTER TABLE test1 CHANGE VX WeChat VARCHAR(33) NOT NULL COMMENT '微信';
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。