Mysql

1. 编码

1.1. Server的字符集

用途: 当你创建数据库,且没有指定字符集、字符序时,server字符集、server字符序就会作为该数据库的默认字符集、排序规则。 如何指定: Mysql服务启动时,可通过命令行参数指定。也可以通过配置文件的变量指定。 character_set_servercollation_server分别对应server字符集、server字符序(比较、排序)

1.2. database的字符集

可以在创建、修改数据库的时候,通过CHARACTER SETCOLLATE指定数据库的字符集、排序规则。

创建数据库:

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 SETCOLLATE,则以对应的字符集、排序规则为准。

  • 创建数据库时,如果没有指定字符集、排序规则,则以character_set_servercollation_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数据库认证密码有两种方式:

  1. MySQL 4.1版本之前是MySQL323加密

  2. 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

优点

关系型数据库是指用关系数学模型来表示的数据,其中是以二维表的形式描述数据。

  1. 结构稳定,不易修改,常用联表查询

  2. 查询能力高,可以操作很复杂的查询

  3. 一致性高,处理数据会使用封锁保证数据不被改变

  4. 表具有逻辑性,易于理解

    SQL缺点

  5. 不适用高并发读写

  6. 不适用海量数据高效读写

  7. 层次多,扩展性低

  8. 维护一致性开销大

  9. 涉及联表查询,复杂,慢

5.2. NoSQL

NoSQL优点

采用键值对存储数据

  1. 由于数据之间没有关系,所以易扩展,也易于查询

  2. 数据结构灵活,每个数据都可以有不同的结构

  3. 由于降低了一致性的要求,所以查询速度更快

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?