Mysql 一篇搞定
Lin
xiaominglin789mysql 关系型数据库
- 数据库-表的本质是文件: xxx.frm、xxx.ibd
- 生产环境: 3306端口一般都会修改成其他端口
- 数据库三层结构
sql-4种语句分类的认识:
- DDL: 数据定义语句(create)
- DML: 数据操作语句(intert、update、delete)
- DQL: 数据查询语句(select)
- DCL: 数据控制语句(权限: grant、revoke)
mysql 增删改查
数据库
的增删改查
1.新建数据库: 当创建数据库时设置 character set
和 collate
时, 在数据库内建数据表将默认采用数据库创建时
设置的 character set
、collate
的字符集和规则。数据表
同样可以手动设置。
character set
: 设置字符集编码, 常用utf8
、utf8mb4
- mysql - utf8: 支持最长三个字节
- mysql - utf8mb4: 支持最长四个字节, 能存储表情字符,兼容型更高, mysql5.5.3+才支持
utf8mb4
。
collate
: 字符集的规则,主要用xxx_bin
、或xxx_ci
xxx_bin
=> 以二进制值比较, 字符区分大小写xxx_ci
=> 不区分大小写- xxx_unicode_ci 比较准确
- xxx_general_ci 速度比较快
- 注意: 应用有德语、法语或者俄语,请一定使用
xxx_unicode_ci
exp:
2.删除数据库: drop database [数据库名];
3.修改数据库编码集: alter database [数据库名] charset='[新的编码]';
4.选择使用某个数据库: use [数据库名];
5.备份数据
- 备份数据库:
mysqldump -u [账号] -p -B [数据库1] [数据库2] [数据库...] > [路径/xxx.sql];
- 备份数据表:
mysqldump -u [账号] -p [数据库名] [表1] [表2] [表...] > [路径/xxx.sql];
- 注意1: 在mysql命令外, 执行
mysqldump
- 注意2: 备份的路径要确保都有文件夹
6.备份恢复(数据库、表)
- 在mysql命令内:
source [路径/xxx.sql];
7.查看数据表的结构
数据表的创建
1.创建数据表: create table if not exists [表名](字段1 类型 约束, 字段1 类型 约束, ...);
- 可选参数: character set -> 设置字符集编码
- 可选参数: collate -> 设置字符集排序校验规则
- 可选参数: engine -> 设置存储引擎(innodb、myisam、blackhole)
例子:
create table if not exists `person`(`id` int,`name` varchar(255),`password` varchar(127),`birthday` date) engine innodb character set utf8mb4 collate utf8mb4_general_ci;
mysql的常用数据类型
数值类型
字符串类型
细节(utf8编码下):
+ 1.char(size) 定了size后, 无论存不存够,都将占用 `size*3` 个字节.+ 2.varchar(size) 范围: 0<=L<=size 个字符, 写入 L 个字节, 只会占用 `L*3` 个字符.create table if not exists `t03`(`title` char(256));ERROR 1074 (42000): Column length too big for column 'title' (max = 255); use BLOB or TEXT instead# char 字符范围: 0-255
mysql> create table if not exists t04
(name
varchar(21845)) engine innodb character set utf8 collate utf8_general_ci;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
mysql> create table if not exists t04
(name
varchar(21844)) engine innodb character set utf8 collate utf8_general_ci;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
utf8 编码下 varchar 的字符范围: 0-21844, 65535-3 / 3 = 21844
create table if not exists t05
(name
varchar(21844)) engine innodb character set utf8mb4 collate utf8mb4_general_ci;
ERROR 1074 (42000): Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead
utf8mb4 编码下,一个字符最大占4个字节。所以 max = 16383 = 65535-3 / 4
特别说明(utf8编码下 1个字符 = 3个字节)
1.char(4)、varchar(4) => 其他里面的 4 都表示 字符, 不是字节。不区分字母
、汉字
、混组合的。
2.char 表示 无论里面存多少内容都需要占 4 3 = 12个字节空间,会造成内存空间的浪费。
3.varchar 则会根据实际内容的大小: 0< L <= 4 ,占 L 3 = 3L 个字节空间(L = 1-3个字节 + 内容数据大小), varchar本身还需要占用1-3个字节
来记录内容长度的。
4.如果数据是定长的字符串, 推荐使用char
如:md5的密码、手机号、身份证号, 请用char(size)
可以提高查询效率
5.
insert into t03 values('adc+1'); ERROR 1406 (22001): Data too long for column 'name' at row 1
数据表
的增删改查
表的常用操作
- 1.增: insert
- 2.删: delete
- 3.改: update
- 4.查: select
增: insert into
查: select ([想查的字段1,想查的字段2...]) from [表名] where [查询条件]
改: update [表名] set 字段1=新值, 字段2=新值 where [条件限定]
删记录: delete from [表名] where [限定条件]
drop table [表名];
删表: mysql 高级操作(多表)
- left join
- 组合
- 约束
- 索引
- 事物