有关binlog的那点事,前端学数据库之基础操作

目录

[1]登录退出 [2]语句规范 [3]常用命令[4]数据库操作

有关binlog的那点事(三)(mysql5.7.13),binlogmysql5.7.13

这次我们要探索更精细的binlog内容,上次讨论的Query_event和Rows_event肯定有让你疑惑不解的问题。Query_event中的status-vars环境变量有哪些,Rows_event的数据类型是什么,元数据又是个什么鬼东西,今天我们就来一一解答。

一、Query_event中的令人费解的status-vars

status-vars据说是为了兼容低版本的mysql服务器而加入的环境变量设置,告诉低版本的mysql服务器sql语句是在什么环境下执行的

具体的格式是状态枚举值 状态参数 

下面以状态枚举值分别讲下比较重要的几个状态:

(1)0x00 Q_FLAGS2_CODE 4个字节

这个主要是对于SQL_AUTO_IS_NULL、FOREIGN_KEY_CHECKS、UNIQUE_CHECKS、AUTOCOMMIT的设置,SQL_AUTO_IS_NULL是自动填充NULL,FOREIGN_KEY_CHECKS是外键检查,UNIQUE_CHECKS是唯一键索引检查,AUTOCOMMIT就是自动提交,在此处SQL_AUTO_IS_NULL = 1,其他均为0。

(2)0x01 Q_SQL_MODE_CODE 8个字节

这里的配置要参考SET sql_mode

对应的状态列表可以参考

可以参考下面的中文翻译:

1)单项模式:

2)混合模式:

  1. ANSI:该项如果设置,和REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE等价,在

  2. DB2:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS一起设置等价。

  3. MAXDB:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER一起设置等价。

  4. MSSQL:该项如果设置, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS. 一起设置等价。

  5. TRADITIONA:该项如果设置,与STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

  6. POSTGRESQL:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS一起设置等价。

  7. ORACLE:该项如果设置,与PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS一起设置等价。

  8. MYSQL323:仅对SHOW CREATE TABLE有影响。

  9. MYSQL40:同上。

(3)0x02 Q_CATALOG 

默认记录为"x3stdx0",即mysql服务器所使用的目录。一字节长度 NULL字符串

(4)0x03 Q_AUTO_INCREMENT 

与AUTO_INCREMENT有关,4字节,前2个字节表示AUTO_INCREMENT,后2个字节表示AUTO_INCREMENT_OFFSET

(5)0x04 Q_CHARSET_CODE

字符集 在连接时客户端设定的字符集(2字节) 连接校对时的字符集(2字节) 服务器校对时的字符集(2字节)

(6)0x05 Q_TIME_ZONE_CODE

时区  一字节长度 字符串,如"x6 08:00" 就是北京时间,这个待确认。

(7)0x07 Q_LC_TIME_NAMES_CODE

星期和月的名称,例如:在英文文中星期一是MON,一月是Jan,在其他文字中就不是这样。

二、Rows_event的数据类型和元数据

这里仅仅介绍常用的数据类型

(1)日期时间类型

1)元数据代表的可以精确到微秒的值 n通常为0-3

对与这种类型的在my_time.h中有相应的定义。

MYSQL_TYPE_DATETIME2,是用longlong数据存储的, 固定是4位 n,元数据代表的是额外数据的长度n

图片 1

 1 //来自mysql5.7.13源码 my_time.c
 2 //将longlong时间转化成字符串
 3 //longlong时间格式:
 4 //按位计算
 5 //1 bit  sign(used when on disk)
 6 //17 bits year * 13   month(year 0 - 9999, month 0 - 12)
 7 //5 bits day(0 - 31)
 8 //5 bits hour(0 - 23)
 9 //6 bits minute(0 - 59)
10 //6 bits second(0 - 59)
11 //24 bits microseconds(0 - 999999)
12 //
13 //Total: 64 bits = 8 bytes
14 //
15 //SYYYYYYY.YYYYYYYY.YYdddddh.hhhhmmmm.mmssssss.ffffffff.ffffffff.ffffffff

View Code

MYSQL_TYPE_TIME2,也是是用longlong数据存储的, 固定是3位 n,元数据代表的是额外数据的长度n

MYSQL_TYPE_TIMESTAMP2,是时间戳,固定是4位,元数据代表的是额外数据的长度n

MYSQL_TYPE_NEWDATE也是以这种方式存的,但是没有元数据

2)不存在元数据,以十进制yyyymmddhhmmss存储的

MYSQL_TYPE_TIMESTAMP,MYSQL_TYPE_DATETIME都是以这种方式存的。

MYSQL_TYPE_TIME是时间戳。

3)MYSQL_TYPE_YEAR,不存在元数据。

这个是1900开始的年份存的

(2)整形,不存在元数据

MYSQL_TYPE_TINY, MYSQL_TYPE_SHORT, MYSQL_TYPE_INT24,MYSQL_TYPE_LONG,MYSQL_TYPE_LONGLONG和原先我们理解的方式一样,只不过是小端数据

(3)实数型

MYSQL_TYPE_FLOAT和MYSQL_TYPE_DOUBLE也是通过小端数据存储的,不同的是他们有一字节元数据,他们的元数据代表他们有效数据的长度。

MYSQL_TYPE_NEWDECIMAL这个小数存储方式不是很明确,仅仅在decimal.h中有定义,但是他的元数据第一个字节代表他有效数据的长度,第二个代表他的精度即小数点后长度

(4)字符串类型

MYSQL_TYPE_VARCHAR 他两字节的元数据是他的最长长度。

MYSQL_TYPE_STRING,MYSQL_TYPE_VAR_STRING 他们的元数据第一个字节代表真正的类型,而第二个字节代表存储字符串长度的字节数大小

(5)bit类型

MYSQL_TYPE_BLOB 他的元数据存储的是bit类型长度的字节数大小

MYSQL_TYPE_BIT 他的元数据存储第一个字节代表有多少bit,而第二个字节代表存储bit类型的字节数大小

为此我们可以得到结论,元数据更多存储的是该类型的长度信息。

具体更详细的请查看mysql5.7.13的源码 log_event.cc:1953::log_event_print_value()获取更多的信息

这次我们要探索更精细的binlog内容,上次讨论的Query_event和Rows_event肯定有让你疑惑不...

MySQL学习笔记,mysql笔记

  

  数据库是一个可以存放数据库对象的容器,数据库对象包括:表、视图、存储过程、函数、触发器、事件。其中,表是数据库最基本的元素,是其他数据库对象的前提条件。

  表中的一列称为一个字段,一行称为一条记录。

 

  1.数据表的创建、查看数据表、查看数据表结构

mysql> CREATE DATABASE test1;
Query OK, 1 row affected (0.02 sec)

mysql> USE test1;
Database changed

mysql> CREATE TABLE table1(
    -> id SMALLINT UNSIGNED,
    -> username VARCHAR(20),
    -> age TINYINT
    -> );
Query OK, 0 rows affected (0.40 sec)

mysql> SHOW DATABASES;
 -------------------- 
| Database           |
 -------------------- 
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
 -------------------- 
5 rows in set (0.00 sec)

mysql> SELECT DATABASE();
 ------------ 
| DATABASE() |
 ------------ 
| test1      |
 ------------ 
1 row in set (0.00 sec)

mysql> SHOW TABLES;
 ----------------- 
| Tables_in_test1 |
 ----------------- 
| table1          |
 ----------------- 
1 row in set (0.00 sec)

mysql> SHOW COLUMNS FROM table1;
 ---------- ---------------------- ------ ----- --------- ------- 
| Field    | Type                 | Null | Key | Default | Extra |
 ---------- ---------------------- ------ ----- --------- ------- 
| id       | smallint(5) unsigned | YES  |     | NULL    |       |
| username | varchar(20)          | YES  |     | NULL    |       |
| age      | tinyint(4)           | YES  |     | NULL    |       |
 ---------- ---------------------- ------ ----- --------- ------- 
3 rows in set (0.00 sec)

mysql> DESCRIBE table1;
 ---------- ---------------------- ------ ----- --------- ------- 
| Field    | Type                 | Null | Key | Default | Extra |
 ---------- ---------------------- ------ ----- --------- ------- 
| id       | smallint(5) unsigned | YES  |     | NULL    |       |
| username | varchar(20)          | YES  |     | NULL    |       |
| age      | tinyint(4)           | YES  |     | NULL    |       |
 ---------- ---------------------- ------ ----- --------- ------- 
3 rows in set (0.00 sec)

 

  2.数据表的删除 DROP TABLE table_name;

mysql> USE test1;
Database changed

mysql> SHOW TABLES;
 ----------------- 
| Tables_in_test1 |
 ----------------- 
| table1          |
| tb2             |
 ----------------- 
2 rows in set (0.00 sec)

mysql> DROP TABLE tb2;
Query OK, 0 rows affected (0.20 sec)

mysql> DESCRIBE tb2;
ERROR 1146 (42S02): Table 'test1.tb2' doesn't exist

 

  3.插入记录、查看记录  INSERT table_name [(col_name, ...)] VALUES(...);

mysql> SHOW COLUMNS FROM table1;
 ---------- ---------------------- ------ ----- --------- ------- 
| Field    | Type                 | Null | Key | Default | Extra |
 ---------- ---------------------- ------ ----- --------- ------- 
| id       | smallint(5) unsigned | YES  |     | NULL    |       |
| username | varchar(20)          | YES  |     | NULL    |       |
| age      | tinyint(4)           | YES  |     | NULL    |       |
 ---------- ---------------------- ------ ----- --------- ------- 
3 rows in set (0.00 sec)

mysql> INSERT table1 VALUES(5,'Tom',22);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT table1 (id,username) VALUES(5,'Tom');
Query OK, 1 row affected (0.10 sec)

mysql> SELECT * FROM table1;
 ------ ---------- ------ 
| id   | username | age  |
 ------ ---------- ------ 
|    5 | Tom      |   22 |
|    5 | Tom      | NULL |
 ------ ---------- ------ 
2 rows in set (0.00 sec)

  

  4.字段的空值与非空  NULL,NOT NULL

mysql> CREATE TABLE table2(
    -> username VARCHAR(20) NOT NULL,
    -> #NULL可加可不加,不加默认可以为空#
    -> age TINYINT
    -> );
Query OK, 0 rows affected (0.25 sec)

mysql> SHOW COLUMNS FROM table2;
 ---------- ------------- ------ ----- --------- ------- 
| Field    | Type        | Null | Key | Default | Extra |
 ---------- ------------- ------ ----- --------- ------- 
| username | varchar(20) | NO   |     | NULL    |       |
| age      | tinyint(4)  | YES  |     | NULL    |       |
 ---------- ------------- ------ ----- --------- ------- 
2 rows in set (0.00 sec)

mysql> INSERT table2 VALUES(NULL,25);
ERROR 1048 (23000): Column 'username' cannot be null

  

  5.主键约束与自动编号  PRIMARY KEY,AUTO_INCREMENT

    ※ 一张数据表只能存在一个主键

    ※ 主键能保证记录的唯一性

    ※ 主键自动为NOT NULL

    ※ AUTO_INCREMENT只能配合PRIMARY KEY使用,不能单独使用。PRIMARY KEY可以单独使用。

mysql> CREATE TABLE table3(
    -> id SMALLINT PRIMARY KEY AUTO_INCREMENT,
    -> username VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.32 sec)

mysql> DESCRIBE table3;
 ---------- ------------- ------ ----- --------- ---------------- 
| Field    | Type        | Null | Key | Default | Extra          |
 ---------- ------------- ------ ----- --------- ---------------- 
| id       | smallint(6) | NO   | PRI | NULL    | auto_increment |
| username | varchar(20) | YES  |     | NULL    |                |
 ---------- ------------- ------ ----- --------- ---------------- 
2 rows in set (0.00 sec)

mysql> INSERT table3 (username) VALUES('XingyaZhao');
Query OK, 1 row affected (0.05 sec)

mysql> INSERT table3 (username) VALUES('XuebiBaby');
Query OK, 1 row affected (0.06 sec)

mysql> INSERT table3 VALUES(4,'David');
Query OK, 1 row affected (0.07 sec)

mysql> INSERT table3 (username) VALUES('Somebody');
Query OK, 1 row affected (0.09 sec)

mysql> SELECT * FROM table3;
 ---- ------------ 
| id | username   |
 ---- ------------ 
|  1 | XingyaZhao |
|  2 | XuebiBaby  |
|  4 | David      |
|  5 | Somebody   |
 ---- ------------ 
4 rows in set (0.00 sec)

mysql> CREATE TABLE table4(
    -> id SMALLINT UNSIGNED PRIMARY KEY,
    -> username VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.30 sec)

mysql> SHOW COLUMNS FROM table4;
 ---------- ---------------------- ------ ----- --------- ------- 
| Field    | Type                 | Null | Key | Default | Extra |
 ---------- ---------------------- ------ ----- --------- ------- 
| id       | smallint(5) unsigned | NO   | PRI | NULL    |       |
| username | varchar(20)          | YES  |     | NULL    |       |
 ---------- ---------------------- ------ ----- --------- ------- 
2 rows in set (0.00 sec)

mysql> INSERT table4 VALUES(6,'ChuanDao');
Query OK, 1 row affected (0.07 sec)

mysql> INSERT table4 VALUES(3,'Pigiu');
Query OK, 1 row affected (0.04 sec)

mysql> INSERT table4 VALUES(3,'York');
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'
mysql> SELECT * FROM table4;
 ---- ---------- 
| id | username |
 ---- ---------- 
|  3 | Pigiu    |
|  6 | ChuanDao |
 ---- ---------- 
2 rows in set (0.00 sec)

   

  6.唯一约束 UNIQUE KEY

    ※ 唯一约束可以保证某个字段中每个记录的唯一性

    ※ 唯一约束的字段可以为空值

    ※ 每张数据表可以存在多个唯一约束

mysql> CREATE TABLE table5(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -> username VARCHAR(20) NOT NULL UNIQUE KEY,
    -> age TINYINT UNSIGNED NOT NULL
    -> );
Query OK, 0 rows affected (0.60 sec)

mysql> SHOW COLUMNS FROM table5;
 ---------- ---------------------- ------ ----- --------- ---------------- 
| Field    | Type                 | Null | Key | Default | Extra          |
 ---------- ---------------------- ------ ----- --------- ---------------- 
| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(20)          | NO   | UNI | NULL    |                |
| age      | tinyint(3) unsigned  | NO   |     | NULL    |                |
 ---------- ---------------------- ------ ----- --------- ---------------- 
3 rows in set (0.02 sec)

mysql> INSERT table5 (username,age) VALUES('XingyaZhao',22);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT table5 (username,age) VALUES('XuebiBaby',21);
Query OK, 1 row affected (0.07 sec)

mysql> INSERT table5 (username,age) VALUES('XingyaZhao',18);
ERROR 1062 (23000): Duplicate entry 'XingyaZhao' for key 'username'

mysql> SELECT * FROM table5;
 ---- ------------ ----- 
| id | username   | age |
 ---- ------------ ----- 
|  1 | XingyaZhao |  22 |
|  2 | XuebiBaby  |  21 |
 ---- ------------ ----- 
3 rows in set (0.00 sec)

    

  7.默认约束 DEFAULT

mysql> CREATE TABLE table6(
    -> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -> username VARCHAR(20) NOT NULL UNIQUE KEY,
    -> age TINYINT UNSIGNED DEFAULT 20
    -> );
Query OK, 0 rows affected (0.29 sec)

mysql> DESCRIBE table6;
 ---------- ---------------------- ------ ----- --------- ---------------- 
| Field    | Type                 | Null | Key | Default | Extra          |
 ---------- ---------------------- ------ ----- --------- ---------------- 
| id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| username | varchar(20)          | NO   | UNI | NULL    |                |
| age      | tinyint(3) unsigned  | YES  |     | 20      |                |
 ---------- ---------------------- ------ ----- --------- ---------------- 
3 rows in set (0.00 sec)

mysql> INSERT table6 (username) VALUES('Xingya');
Query OK, 1 row affected (0.08 sec)

mysql> INSERT table6 (username) VALUES('Jude');
Query OK, 1 row affected (0.05 sec)

mysql> INSERT table6 (username,age) VALUES('Tom',21);
Query OK, 1 row affected (0.08 sec)

mysql> SELECT * FROM table6;
 ---- ---------- ------ 
| id | username | age  |
 ---- ---------- ------ 
|  1 | Xingya   |   20 |
|  2 | Jude     |   20 |
|  3 | Tom      |   21 |
 ---- ---------- ------ 
3 rows in set (0.00 sec)

 

数据库是一个可以存放数据库对象的容器,数据库对象包括:表、视图、存储过程、函数、触发器、事件。其中,...

登录退出

  操作数据库的第一步是登录数据库,通常需要提供一个MySQL用户名和密码。如果服务器运行在登录服务器之外的其它机器上,还需要指定主机名

参数           描述
-D            (database)打开指定数据库
-h            (host)服务器名称
-p            (password)密码
-P            (port)端口号
-u            (user)用户名
-V            (version)输出版本信息并退出

图片 2

  mysql数据库退出有三种方式,分别是exit;、quit;、q;。任选一种即可

图片 3  

语句规范

  在操作数据库之前,要先了解数据库的语句规范,主要有以下三条

  1、关键字与函数名称全部大写

  2、数据库名称、表名称、字段名称全部小写

  3、SQL语句必须以分号结尾

 

本文由ca88手机版登录发布于亚洲城ca88手机版官网,转载请注明出处:有关binlog的那点事,前端学数据库之基础操作

TAG标签: ca88手机版登录
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。