- PreparedStatement ps = connection.prepareStatement("SELECT * FROM `godpan_fans` where id=?");
- ps.setInteger(1, 1);
- ps.executeQuery();
获得下面的PREPARE_OK包,仅供参考:
如不雅膳绫擎的columns大年夜于0,以及parameters大年夜于0,则将有额外的两个包传输,分别是columns的信息以及parameters的信息,对应信息构造:
内容 含义 Field columns信息若干好多个) EOF columns信息停止 Field parameters若干好多个) EOF parameters停止到此全部PREPARE_OK包发送完毕。
Row Data Binary
这个包跟膳绫擎提到的Row Data包有什么差别呢?重要有两点:
- 用不合的方法定义NULL;
- 数据编码不再纯真的应用LengthEncodedString,而是根据数据类型的不合进行响应的编码;
后面我会分别解释这两点,我们先来看看它的构造:
相对包内容的地位 长度(字节) 名称 描述 0 1 包头标识 0x00 1 (col_count+7+2)/8 Null Bit Map 前两位为预留字节,重要用于差别与其他的几种包(OK,ERROR,EOF),在MySQL 5之后这两个字节都为0X00,个中col_count为列的数量 (col_count+7+2)/8 + 1 n column values 具体的列值,反复多次,根据值类型编码Handshake packet
如今我们来看一下它的两个特点,起首我们来看它是若何来定义NULL的,起首我们看到他的构造中有一个Null Bit Map,除去两个标识位,真正用于标识数据信息的就是(col_count+7)/8位字节,这里我先给出结论,后面再给大年夜家具体分析:
参数个数 长度(字节) 具体值范围 描述 1-8 1 -1, 2^n组合 1 = 2^0表示第一个参数为NULL,3 = 2^0 + 2^1表示第一个和第二参数为NULL...膳绫擎给出了标识NULL的根本算法,原则是哪个参数(次序为n)为NULL,则Null Bit Map响应的值加上2^n,8个参数为一个周期,以词攀类推。
接着我们来看一下第二点,是若何器具体值类型来对响应的值进行编码的,这里重要分为三类,根本数据类型,时光类型,字符串类型;
- 根本数据类型:比如TINYINT应用一个字节编码,FLOAT应用四个字节,DOUBLE应用8个字节等;
- 时光类型:应用类似LengthEncodedString的编码方法编码,具体可参考MySQL_PROTOCOL;
- 字符串类:不属于膳绫擎两类的都属于字符串类型,应用通俗的LengthEncodedString;
Execute包
Execute包顾名思义是一个履行包,它是由Client端发送到Server端的,但它和通俗的敕令又有点不合,它主如果用来履行预处理语句,并会携带响应参数,具体构造如下:
长度 含义 1 COM_EXECUTE(标识是一个Execute包) 4 预处理语句id 1 游标类型 4 预留字节 0 接下去的内容只有在有参数的情况下 (param_count+7)/8 null_bit_map(描述参数中NULL的情况) 1 参数绑定情况 n*2 参数类型(依次存储) n 参数具体值(非NULL)(依次存储,应用Row Data Binary方法编码)Execute包大年夜Client端发送到Server端后可能会获得以下几个结不雅:
- OK包
- ERROR包
- Result Set包(可能多个)
其实重要就是两步,Client将履行敕令编码成Server请求的格局传输给Server端履行,Server端将履行结不雅传输给Client端,Client端再根据响应的数据包格局解析获得所需的数据。
我们须要根据包的不合类型来进行不合的处理。
总结
- Error{errno=1046, sqlState='3D000', message='No database selected'}
推荐阅读
CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了alter user user() identified by 'admin'; 这几天因为做项目须要,要应用MySQL数据库,应用的是MySQL Community Server 5.7.>>>详细阅读
本文标题:关于MySQL的网络协议分析
地址:http://www.17bianji.com/lsqh/39379.html
1/2 1