• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > mysql 协议的ColumnDefinition包及解析代码详情

mysql 协议的ColumnDefinition包及解析代码详情

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了mysql ,ColumnDefinition等相关知识,希望本文的分享对您有所帮助


git

https://github.com/sea-boat/mysql-protocol

概况

ColumnDefinition包属于服务端返回ResultSet时的其中一部分包,用于描述结果集的字段信息。

mysql通信报文结构

类型名字描述
int<3>payload长度按照the least significant byte first存储,3个字节的payload和1个字节的序列号组合成报文头
int<1>序列号
stringpayload报文体,长度即为前面指定的payload长度

ColumnDefinition包

Payload

lenenc_str     catalog
lenenc_str     schema
lenenc_str     table
lenenc_str     org_table
lenenc_str     name
lenenc_str     org_name
lenenc_int     length of fixed-length fields [0c]2              
character set4              
column length1              
type2              
flags1              
decimals2              
filler [00] [00]  if command was COM_FIELD_LIST {
lenenc_int     
length of default-valuesstring[$len]   
default values
  }

更多详情 : http://dev.mysql.com/doc/internals/en/com-query-response.html#column-definition

ColumnCount包类

/**
 * 
 * <pre><b>column definition command packet.</b></pre>
 * @author 
 * <pre>seaboat</pre>
 * <pre><b>email: </b>849586227@qq.com</pre>
 * <pre><b>blog: </b>http:///;/pre>
 * @version 1.0
 * @see http:///
 */public class ColumnDefinitionPacket extends MySQLPacket {
    private static final byte[] DEFAULT_CATALOG = "def".getBytes();    
    private static final byte NEXT_LENGTH = 0x0c;    
    private static final byte[] FILLER = { 00, 00 };    
    public byte[] catalog = DEFAULT_CATALOG;// always "def"
    public byte[] schema;    
    public byte[] table;    
    public byte[] orgTable;    
    public byte[] name;    
    public byte[] orgName;    
    public byte nextLength = NEXT_LENGTH;// always 0x0c
    public int charsetSet;    
    public long length;    
    public int type;    
    public int flags;    
    public byte decimals;    
    public byte[] filler = FILLER;    
    public byte[] defaultValues;    
    public void read(byte[] data) {
        MySQLMessage mm = new MySQLMessage(data);        
        this.packetLength = mm.readUB3();        
        this.packetId = mm.read();        
        this.catalog = mm.readBytesWithLength();        
        this.schema = mm.readBytesWithLength();        
        this.table = mm.readBytesWithLength();        
        this.orgTable = mm.readBytesWithLength();        
        this.name = mm.readBytesWithLength();        
        this.orgName = mm.readBytesWithLength();        
        this.nextLength = mm.read();        
        this.charsetSet = mm.readUB2();        
        this.length = mm.readUB4();        
        this.type = mm.read() & 0xff;        
        this.flags = mm.readUB2();        
        this.decimals = mm.read();        
        this.filler = mm.readBytes(2);        
        if (mm.hasRemaining()) {            
        this.defaultValues = mm.readBytesWithLength();
        }
    }    @Override
    public void write(ByteBuffer buffer) {        
    int size = calcPacketSize();
        BufferUtil.writeUB3(buffer, size);
        buffer.put(packetId);
        BufferUtil.writeWithLength(buffer, catalog, (byte) 0);
        BufferUtil.writeWithLength(buffer, schema, (byte) 0);
        BufferUtil.writeWithLength(buffer, table, (byte) 0);
        BufferUtil.writeWithLength(buffer, orgTable, (byte) 0);
        BufferUtil.writeWithLength(buffer, name, (byte) 0);
        BufferUtil.writeWithLength(buffer, orgName, (byte) 0);
        buffer.put(NEXT_LENGTH);
        BufferUtil.writeUB2(buffer, charsetSet);
        BufferUtil.writeUB4(buffer, length);
        buffer.put((byte) (type & 0xff));
        BufferUtil.writeUB2(buffer, flags);
        buffer.put(decimals);
        buffer.put(FILLER);        
        if (defaultValues != null) {            
        //only use for show columns
            BufferUtil.writeWithLength(buffer, defaultValues);
        }
    }    @Override
    public int calcPacketSize() {        
    int size = (catalog == null ? 1 : BufferUtil.getLength(catalog));
        size += (schema == null ? 1 : BufferUtil.getLength(schema));
        size += (table == null ? 1 : BufferUtil.getLength(table));
        size += (orgTable == null ? 1 : BufferUtil.getLength(orgTable));
        size += (name == null ? 1 : BufferUtil.getLength(name));
        size += (orgName == null ? 1 : BufferUtil.getLength(orgName));
        size += 13;        if (defaultValues != null) {
            size += BufferUtil.getLength(defaultValues);
        }        
        return size;
    }    
    @Override
    protected String getPacketInfo() {        
    return "MySQL Column Definition Packet";
    }

}

以上就是mysql 协议的ColumnDefinition包及解析代码详情的内容,更多相关内容请关注微课江湖()!

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MySQL essential版本和普通版本有什么区别?
  • 如何用SQL命令查看Mysql数据库大小
  • 解析mysql中如何获得数据库的大小
  • 解析mysql修改为utf8后仍然有乱码的问题
  • 解析远程连接管理其他机器上的MYSQL数据库
  • MySQL timestamp自动更新时间分享
  • MySQL Order by 语句用法与优化详解
  • 深入解析mysql中order by与group by的顺序问题
  • 解析mysql不重复字段值求和
  • MySql实现跨表查询的方法详解

相关文章

  • 2018-12-05Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)
  • 2018-12-05mysql批量执行sql文件的方法_MySQL
  • 2017-05-11MySQL 百万级分页优化(Mysql千万级快速分页)
  • 2018-12-05sqlserver 快速生成汉字的首拼字母的函数(经典)
  • 2017-08-25linux装mysql问题
  • 2018-12-05新浪SAE如何操作MySql数据库?
  • 2018-12-05mysql字段类型选择方法
  • 2017-05-11mysql自动化安装脚本(ubuntu and centos64)
  • 2018-12-05SQL小技巧 又快又简单的得到你的数据库每个表的记录数
  • 2018-12-05MySQL之-Ignoring query to other database的解决方法

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MYSQL无法启动提示: Default storage engine (InnoDB) is not a
    • MySQL函数大全及用法示例分享
    • MYSQL5 masterslave数据同步配置方法第1/3页
    • MemSQL学习笔记-类似MySQL的数据库
    • 如何实现python3实现并发访问水平切分表
    • MySQL 密码设置
    • MySQL性能优化
    • sqlserver 批量删除存储过程和批量修改存储过程的语句
    • MySQL查询倒数第二条记录实现方法
    • MySQL 转义字符使用说明

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有