Mysql
1. 编码
1.1. Server的字符集
用途: 当你创建数据库,且没有指定字符集、字符序时,server字符集、server字符序就会作为该数据库的默认字符集、排序规则。 如何指定: Mysql服务启动时,可通过命令行参数指定。也可以通过配置文件的变量指定。 character_set_server、collation_server分别对应server字符集、server字符序(比较、排序)
1.2. database的字符集
可以在创建、修改数据库的时候,通过CHARACTER SET、COLLATE指定数据库的字符集、排序规则。
创建数据库:
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]例子:创建数据库test_schema,字符集设置为utf8,此时默认的排序规则为utf8_general_ci。
CREATE DATABASEtest_schemaDEFAULT CHARACTER SET utf8;
修改数据库:
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]查看数据库的字符集/字符序
查看
test_schema的字符集、排序规则。(需要切换默认数据库)
也可以通过下面命令查看
test_schema的字符集、数据库(不需要切换默认数据库)
也可以通过查看创建数据库的语句,来查看字符集。
database字符集、字符序是怎么确定的
创建数据库时,指定了
CHARACTER SET或COLLATE,则以对应的字符集、排序规则为准。创建数据库时,如果没有指定字符集、排序规则,则以
character_set_server、collation_server为准。
1.3. table的字符集
创建
例子如下,指定字符集为utf8,字符序则采用默认的。
查看
SHOW TABLE STATUS查看
information_schema.TABLES的信息
方式三:通过
SHOW CREATE TABLE确认。
1.4. column的字符集
查看数据库编码
设置数据库编码
2. 基础
2.1. mysql数据库默认库
information_schema
其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等
mysql
这个是mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息
performance_schema
性能相关
test
2.2. Mysql密码存储
MySQL数据库认证密码有两种方式:
MySQL 4.1版本之前是MySQL323加密
MySQL 4.1和之后的版本都是MySQLSHA1加密
MySQL数据库中自带old_password(str)和password(str)函数,前者是MySQL323加密,后者是MySQLSHA1方式加密;
用户的密码存储在 mysql.user 表中。加密算法为plugin字段。 
2.3. Mysql表的权限
mysql表权限里面,除了增删改查,文件读写,还有哪些权限? mysql存在很多权限,包括:全局权限、数据库层权限、表层权限和列层权限。
mysql.user中的**_pri为权限。
MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户创建用户CREATE USER 'username'@'host' IDENTIFIED BY 'password';授权GRANT privileges ON databasename.tablename TO 'username'@'host'撤销用户权限REVOKE privilege ON databasename.tablename FROM 'username'@'host';
2.4. Mysql事务
ACID
A 事务的原子性(Atomicity):指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.
C 事务的一致性(Consistency):指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.
I 独立性(Isolation): 事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.
D持久性(Durability): 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
2.5. Mysql存储引擎
mysql不同的存储引擎使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。 通过SHOW ENGINES;查看当前库支持什么引擎。
创建存储引擎
修改存储引擎
我了解四个引擎,包括:内存表、分表、innodb、myisam
innodb
支持事务
支持行级锁:只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁。
支持外键
更适用于更新和删除操作
myisam
读取数据和插入数据速度快
存在三个文件,frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex),可以转移。
索引字段的长度有限制
MEMORY
速度快,会丢失。 !需要补充LFT的内存表处理。存储到内存中!
MRG_myisam
用于分表的处理。允许将结构相同的表挂载到一张总表中。
2.6. 索引
类别 索引本质是一种数据结构。 MYSQL目前提供了一下4种索引。
B-Tree 索引:最常见的索引类型,大部分引擎都支持B树索引。
HASH 索引:只有Memory引擎支持,使用场景简单。
R-Tree 索引(空间索引):空间索引是MyISAM的一种特殊索引类型,主要用于地理空间数据类型。
Full-text (全文索引):全文索引也是MyISAM的一种特殊索引类型,主要用于全文索引,InnoDB从MYSQL5.6版本提供对全文索引的支持。
其中 B-Tree包含下面三种
普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:
(1)创建索引: CREATE INDEX 索引名 ON 表名(列名1,列名2,...);
(2)修改表: ALTER TABLE 表名ADD INDEX 索引名 (列名1,列名2,...);
(3)创建表时指定索引:CREATE TABLE 表名 ( [...], INDEX 索引名 (列名1,列名 2,...) );
UNIQUE索引
表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique:
(1)创建索引:CREATE UNIQUE INDEX 索引名 ON 表名(列的列表);
(2)修改表:ALTER TABLE 表名ADD UNIQUE 索引名 (列的列表);
(3)创建表时指定索引:CREATE TABLE 表名( [...], UNIQUE 索引名 (列的列表) );
主键:PRIMARY KEY索引
使用原则
用在 在where子句中出现的列,在join子句中出现的列,而不是在SELECT关键字后选择列表的列;
索引列的基数越大,索引的效果越好。例如,存放出生日期的列具有不同的值,很容易区分行,而用来记录性别的列,只有"M"和"F",则对此进行索引没有多大用处,因此不管搜索哪个值,都会得出大约一半的行,( 见索引选择性注意事项对选择性解释;)(类型死于信息熵)
使用短索引,如果对字符串列进行索引,应该指定一个前缀长度,可节省大量索引空间,提升查询速度;
利用最左前缀
注意事项 MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in, 以及某些时候的like(不以通配符%或_开头的情形)。
弊端 因为索引是单独存储的,所以会占用空间。同时插入数据时也会消耗更多的时间。
2.7. MYSQL 读锁、写锁
锁
乐观锁
用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加1。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
悲观锁
操作时必须使用锁。即使用读锁和写锁。写锁就是大家都能都读,不能写。写锁就是只有一个能读能写。
行锁
多个事务操作同一行数据时,后来的事务处于阻塞等待状态。
表锁
pymysql python操作mysql实现并发时,应该是创建并发的链接。因为cursor游标存在锁,不能同时使用。
2.8. 优化Mysql
优化sql语句 使用索引 分库分表 连接池
3. Sql注入
3.1. 5.0上下的版本区别
Mysql的网站注入,5.0以上和5.0以下有什么区别? #sql 5.0以下没有information_schema这个系统表,无法列表名等,只能暴力跑表名, 比如通过字典 5.0以下是多用户单操作,5.0以上是多用户多操做。 5.0以下
判断表是否存在
and exists (select * from admin) //猜解是否含有admin这个表判断字段是否存在
and exists (select username from admin) //猜解是否含有username这个字段and exists (select password from admin) //猜解是否含有password这个字段
3.2. Mysql端口
为何一个Mysql数据库的站,只有一个80端口开放?#信息收集 更改了端口,没有扫描出来。 站库分离。 3306端口不对外开放
3.3. 一个 @ 和两个@的区别
@为用户变量,使用SET @var1=1赋值,select @var1@@为系统变量 ,包括全局变量show global variables和会话变量show session variables
3.4. Mysql写shell
条件
权限
知道绝对路径
能使用单引号/双引号 (GPC)
secure_file_priv
限制mysqld 不允许导入 | 导出:
mysqld --secure_file_prive=null
限制mysqld 的导入 | 导出 只能发生在/tmp/目录下:
mysqld --secure_file_priv=/tmp/
为空的时候,不对mysqld 的导入 | 导出做限制:
cat /etc/my.cnf
[mysqld]
secure_file_priv=
4. 提权
5. NoSQL
SQL和NoSQL的区别 SQL关系型数据库,NoSQL(Not only SQL)非关系型数据库
5.1. SQL
优点
关系型数据库是指用关系数学模型来表示的数据,其中是以二维表的形式描述数据。
结构稳定,不易修改,常用联表查询
查询能力高,可以操作很复杂的查询
一致性高,处理数据会使用封锁保证数据不被改变
表具有逻辑性,易于理解
SQL缺点
不适用高并发读写
不适用海量数据高效读写
层次多,扩展性低
维护一致性开销大
涉及联表查询,复杂,慢
5.2. NoSQL
NoSQL优点
采用键值对存储数据
由于数据之间没有关系,所以易扩展,也易于查询
数据结构灵活,每个数据都可以有不同的结构
由于降低了一致性的要求,所以查询速度更快
5.3. 比较
非关系型数据库的产生是因为随着网站的进化,并发性增加,扩展性高,一致性要求降低。这样关系型数据库最重要的一致性维护就显得有点多余,并且消耗着性能。因此有了非关系型数据库,它可以算是关系型数据库的一种弱化的结果,在海量数据存储和查询上更胜一筹。 两种数据库没有好坏之分,只是使用的环境不一样。关系型数据库可以说是更严谨的,可靠性更强的数据库,在对于数据精度要求高的环境,比如说银行系统这样自然是像mysql这样的数据库适合。非关系型数据库胜在处理大数据的速度,但是对于数据的准确度没有那么高,对于操作量大的环境比如当前大部分web2.0的网站更加适用一些。
5.4. MongoDB注入方式
利用正则:找到y开头的 name db.items.find({name: {$regex: "^y"}})
一些payload
?login[$regex]=^&password[$regex]=^?login[$not][$type]=1&password[$not][$type]=1
Last updated
Was this helpful?