主题在本节中:
本节提供关于X协议定义了消息的详细信息。
信息有:
4字节长度(小端字节)
1个字节消息类型
一个message_payload
的长度. length - 1
的message_payload
从protobuf文件生成使用吗protoc
:
美元protoc——cpp_out = protodir mysqlx * .proto
的message_type
可以从<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">ClientMessages
client-messages和从<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">ServerMessages
服务器端消息。
在c++
他们暴露在mysqlx.pb.h
在ClientMessages
类。
ClientMessages.MsgCase。kMsgConGetCap ClientMessages.kMsgConGetCapFieldNumber
消息通常出现在一个序列。每个初始消息(引用的<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">ClientMessages
)与一组可能的消息后。
消息序列:
如果到达最终状态或成功完成
是流产<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html" title="错误消息">错误消息一个>
在任何时间在当地<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html" title="通知">通知一个>可能是服务器发送的消息序列的一部分。
全球<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html" title="通知">通知一个>在任何时候可能发送的服务器。
客户端发送初始消息后,服务器会发送一个<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">错误
消息在任何时候终止当前消息序列。
id的消息可以从客户机发送到服务器。
这个消息没有发送。这只是用来让protoc
:
生成常数
检查独特性
消息ClientMessages{枚举类型{CON_CAPABILITIES_GET = 1;CON_CAPABILITIES_SET = 2;CON_CLOSE = 3;SESS_AUTHENTICATE_START = 4;SESS_AUTHENTICATE_CONTINUE = 5;SESS_RESET = 6;SESS_CLOSE = 7;SQL_STMT_EXECUTE = 12;CRUD_FIND = 17;CRUD_INSERT = 18; CRUD_UPDATE = 19; CRUD_DELETE = 20; EXPECT_OPEN = 24; EXPECT_CLOSE = 25; } }
id的消息可以从服务器发送到客户机。
这个消息没有发送。这只是用来让protoc
:
生成常数
检查独特性
消息ServerMessages{枚举类型{好= 0;错误= 1;CONN_CAPABILITIES = 2;SESS_AUTHENTICATE_CONTINUE = 3;SESS_AUTHENTICATE_OK = 4;/ /通知已永远留在11通知= 11;RESULTSET_COLUMN_META_DATA = 12;RESULTSET_ROW = 13;RESULTSET_FETCH_DONE = 14;RESULTSET_FETCH_SUSPENDED = 15; RESULTSET_FETCH_DONE_MORE_RESULTSETS = 16; SQL_STMT_EXECUTE_OK = 17; RESULTSET_FETCH_DONE_MORE_OUT_PARAMS = 18; }; }
有关更多信息,请参见<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-notices-notices.html" title="">通知。
服务器可以发送<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-notices-notices.html" title="">通知框架
客户端在任何时间。
通知可以:
全球(.scope = =全球
)或
属于当前执行<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html" title="消息序列">消息序列一个>(当地.scope = = +消息序列是活跃的
):
如果服务器发送一个当地的
注意虽然没有消息序列是活跃的,通知应被忽略。
通知
通知:
从服务器发送到客户端
可能是全球或与当前的消息序列
常见的所有通知框架
.type | 价值 |
---|---|
警告 |
1 |
SessionVariableChanged |
2 |
SessionStateChanged |
3 |
有效负载的类型
通知的有效载荷
全局或局部的通知
消息帧{enum范围{全球= 1;当地= 2;};需要uint32类型= 1;可选范围范围= 2(默认=全球);可选的字节负载= 3;}
服务器端警告和笔记
.scope
= =当地的
. level
,.code
和.msg
地图的内容:
显示警告
.scope
= =全球
(未定义)将用于全球,非结构化信息:
服务器关闭
一个节点断开
模式或表了
框架 场 |
价值 |
---|---|
.type |
1 |
.scope |
当地的 或全球 |
预警级别:注意或警告
警告的代码
警告消息
消息警告{enum水平{注意= 1;警告= 2;错误= 3;};可选级别水平= 1(默认=警告);需要uint32代码= 2;需要字符串味精= 3;}
通知客户更改当前会话变量。
每改变一个变量,可以通过:
显示会话变量
框架 场 |
价值 |
---|---|
.type |
2 |
.scope |
当地的 |
参数属于命名空间
变量的名称
参数的变化值
消息SessionVariableChanged{所需的字符串参数= 1;可选Mysqlx.Datatypes。标量值= 2;}
通知客户更改内部会话状态。
框架 场 |
价值 |
---|---|
.type |
3 |
.scope |
当地的 |
关键参数
更新过的值
消息SessionStateChanged{枚举参数{CURRENT_SCHEMA = 1;ACCOUNT_EXPIRED = 2;GENERATED_INSERT_ID = 3;ROWS_AFFECTED = 4;ROWS_FOUND = 5;ROWS_MATCHED = 6;TRX_COMMITTED = 7;TRX_ROLLEDBACK = 9;PRODUCED_MESSAGE = 10;CLIENT_ID_ASSIGNED = 11; // .. more to be added } required Parameter param = 1; optional Mysqlx.Datatypes.Scalar value = 2; }
得到支持的连接能力和他们的当前状态。
功能
或<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">错误
消息CapabilitiesGet {};
设置自动连接功能。
只提供值改变了,其他值保持不变。如果任何改变失败,所有的变化都被丢弃。
活动会话= = 0
好吧
或<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">错误
消息CapabilitiesSet{所需的功能功能= 1;};
消息管理会话。
有关更多信息,请参见<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-expect-expectations.html" title="">预期。
期望的操作
打开一个期望块并设置/设置必须满足的条件。
如果任何条件失败,所有封闭的消息将失败Mysqlx.Error
消息。
好吧
成功,<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">错误
在错误
消息公开{消息条件{enum ConditionOperation{/ / / / / /设置设置条件,如果不设置/ /覆盖,如果设置EXPECT_OP_SET = 0;/ /设置条件EXPECT_OP_UNSET = 1;};需要uint32 condition_key = 1;可选的字节condition_value = 2;可选ConditionOperation op = 3(默认= EXPECT_OP_SET);};enum CtxOperation{/ /复制操作从父Expect-block EXPECT_CTX_COPY_PREV = 0;/ /开始空集的操作EXPECT_CTX_EMPTY = 1;}; optional CtxOperation op = 1 [ default = EXPECT_CTX_COPY_PREV ]; repeated Condition cond = 2; }
关闭一个期望。
关闭一个期望块恢复先前期望的状态块以下的信息。
好吧
成功,<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">错误
在错误
消息关闭{}
CRUD操作的工作下面的SQL语句以类似的方式:
准备CRUD操作
执行操作
得到结果的描述
批量获取行
准备关闭操作
基本的CRUD操作。
更新操作。
规范更新的价值:
如果data_model表,然后列名可以被指定
如果列类型是JSON,那么可以指定document_path此外
如果data_model文档,然后只允许文件路径
在这两种情况下,schema_name和table_name必须没有设置。
执行操作的类型
一个表达式计算的新值
消息UpdateOperation {enum UpdateType{设置= 1;/ /只允许对表ITEM_REMOVE = 2;/ /没有价值(删除识别路径从一个对象或数组)ITEM_SET = 3;/ /设置新值确定路径ITEM_REPLACE = 4;/ /替换值如果路径存在ITEM_MERGE = 5;/ /源和价值必须文档ARRAY_INSERT = 6;/ /插入数组中的值在源路径指数确定ARRAY_APPEND = 7;/ /添加路径标识的值在数组Mysqlx.Expr所需}。ColumnIdentifier源= 1;UpdateType操作所需= 2;可选Mysqlx.Expr。Expr值= 3; }
找到文件/行/表集合。
集合插入
数据模型的操作参考
列表的列预测应当退还
用于筛选器表达式的参数值
过滤条件
行应跳过,回来的数量
排序顺序的行/文档应当退还
列表达式列表聚合(集团)
过滤条件对聚合组
消息找到{必需收集收集= 2;可选DataModel data_model = 3;重复投影投影= 4;可选Mysqlx.Expr。Expr标准= 5;Mysqlx.Datatypes重复。标量参数= 11;可选的限制限制= 6;重复的订单订单= 7;Mysqlx.Expr重复。Expr分组= 8;可选Mysqlx.Expr。Expr grouping_criteria = 9; };
插入文件/行/表集合。
集合插入
数据模型的操作参考
将数据插入的列名称(空如果data_model文档)
组行插入到集合/表(一个表达式和一个JSON文档文字或一个对象表达式)
行表达式中使用的参数值
消息插入{必需收集收集= 1;可选DataModel data_model = 2;重复列投影= 3;消息TypedRow {Mysqlx.Expr重复。Expr字段= 1;};重复TypedRow行= 4;Mysqlx.Datatypes重复。标量参数= 5;};
更新文件/行/表集合。
收集改变
数据模型的操作参考
筛选器表达式匹配行操作将应用
用于筛选器表达式的参数值
限制匹配的行数
指定的顺序匹配的行
被应用的操作列表。将取决于data_model有效操作。
消息更新{必需收集收集= 2;可选DataModel data_model = 3;可选Mysqlx.Expr。Expr标准= 4;Mysqlx.Datatypes重复。标量参数= 8;可选的限制限制= 5;重复的订单订单= 6;重复UpdateOperation操作= 7;};
准备执行的语句
执行该语句
得到的描述行
批量获取行
准备关闭操作
随着stmt-id
和cursor-id
分配的客户端,客户端可以管道,假定所有的步骤成功的消息。如果一个命令创建了一个错误,所有以下命令也应该失败,因此可以将错误与正确的消息。
MySQL的消息包。
执行一个给定的名称空间声明。
这个消息可能会生成一个包含生成的警告通知其执行。这个消息可能会生成一个包含信息消息的通知由其执行。
要执行的名称空间声明
声明中应当执行。
通配符替换的值
只发送类型信息ColumnMetadata
、跳过名称等等
0或1<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">Mysqlx.Resultset::
紧随其后的是<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">StmtExecuteOk
消息StmtExecute{可选的字符串名称空间= 3(默认=“sql”);需要= 1字节支撑;Mysqlx.Datatypes重复。任何参数= 2;可选的bool compact_metadata = 4(默认= false);}
元数据的列。
使用的编码不同字节
元数据字段是外部控制。参见:<一个class="ulink" href="//www.delbede.com/doc/refman/5.0/en/charset-connection.html" target="_top">https://dev.10bet靠谱mysql.com/doc/refman/5.0/en/charset-connection.html一个>
服务器可能不设置original_{表|名称}
字段是否等于平原{表|名称}
字段。
客户端必须重建它:
如果.original_name空. name并不是空:.original_name = . name如果.original_table空.table并不是空:.original_table = .table
紧凑的元数据格式
可以通过客户端请求。在这种情况下,.type
设置和所有其他字段是空的。
Mysqlx.Resultset预期的数据类型。行/ SQL类型为非空值:
SQL类型 | .type | 长处 | .frac_dig | .flags | .charset |
---|---|---|---|---|---|
小 | 它们 | x | |||
小无符号 | 使用UINT | x | x | ||
短 | 它们 | x | |||
无符号短 | 使用UINT | x | x | ||
INT24 | 它们 | x | |||
INT24无符号 | 使用UINT | x | x | ||
INT | 它们 | x | |||
INT无符号 | 使用UINT | x | x | ||
龙龙的 | 它们 | x | |||
龙龙的无符号 | 使用UINT | x | x | ||
双 | 双 | x | x | x | |
浮动 | 浮动 | x | x | x | |
小数 | 小数 | x | x | x | |
VARCHAR, CHAR,… | 字节 | x | x | x | |
几何 | 字节 | ||||
时间 | 时间 | x | |||
日期 | DATETIME | x | |||
DATETIME | DATETIME | x | |||
一年 | 使用UINT | x | x | ||
时间戳 | DATETIME | x | |||
集 | 集 | x | |||
枚举 | 枚举 | x | |||
零 | 字节 | ||||
位 | 位 | x |
SQL“零”值发送一个空的字段值<一个class="link" href="//www.delbede.com/doc/internals/en/x-protocol-messages-messages.html">行
。
protobuf编码的原始数据类型描述<一个class="ulink" href="https://developers.google.com/protocol-buffers/docs/encoding" target="_top">https://developers.google.com/protocol-buffers/docs/encoding一个>
它们
长处
最多可显示的小数位数(包括负号)的类型。
有效的范围是0 - 255,但通常你会看到1 - 20。
SQL类型 | 每个类型的最大数字 |
---|---|
小签 | 4 |
短签名 | 6 |
INT24签署 | 8 |
INT签署 | 11 |
龙龙的签署 | 20. |
的定义米
在<一个class="ulink" href="//www.delbede.com/doc/refman/5.5/en/numeric-type-overview.html" target="_top">https://dev.10bet靠谱mysql.com/doc/refman/5.5/en/numeric-type-overview.html一个>。
价值
可变长度编码签署了64整数。
使用UINT
.flags & 1
(补零)
客户端必须留给垫0 . length。
长处
最多可显示的小数位数的类型。
有效的范围是0 - 255,但通常你会看到1 - 20。
SQL类型 | 最大位数/类型 |
---|---|
小无符号 | 3 |
无符号短 | 5 |
INT24无符号 | 8 |
INT无符号 | 10 |
龙龙的无符号 | 20. |
的定义米
在<一个class="ulink" href="//www.delbede.com/doc/refman/5.5/en/numeric-type-overview.html" target="_top">https://dev.10bet靠谱mysql.com/doc/refman/5.5/en/numeric-type-overview.html一个>。
价值
可变长度编码64无符号整数。
位
长处
最多可显示的二进制位数。
米的有效范围位
类型是1 - 64。
价值
可变长度编码64无符号整数。
双
长处
最多可显示的小数位数(包括小数点和.fractional_digits
)。
.fractional_digits
小数点后最多可显示的小数位数。
价值
编码为protobuf的“双”。
浮动
长处
最多可显示的小数位数(包括小数点和.fractional_digits
)。
.fractional_digits
小数点后最多可显示的小数位数。
价值
编码为protobuf的“浮动”。
字节,枚举
字节是用于所有不透明的字节字符串可能有一个字符集:
团,TINYBLOB MEDIUMBLOB LONGBLOB
非常小的文本串、文本简单量变
VARCHAR、VARBINARY
CHAR、二进制
枚举
长处
最大长度的字符的基本类型。
.flags & 1
(rightpad)
如果字段的长度小于长处
,接收方应该添加填充字符字符串的右端。如果.charset
“二元”,填充字符是什么0 x00
,否则这是一个空格字符所定义的字符集。
SQL类型 | 长处 | .charset | .flags |
---|---|---|---|
TINYBLOB | 256年 | 二进制 | |
团 | 65535年 | 二进制 | |
VARCHAR (32) | 32 | use utf8 | |
VARBINARY (32) | 32 | utf8_bin | |
二进制(32) | 32 | 二进制 | rightpad |
CHAR (32) | 32 | use utf8 | rightpad |
价值
添加了一个额外的字节序列0 x00
最后字节。获得原始字符串,额外的0 x00
应该被删除。字符串的长度可以获得与protobuf字段长度()
方法:
字节序列的长度= length-of-field - 1
额外的字节可以区分一个空的空字节序列。
时间
一个时间值。
价值
字节顺序如下:
否定(小时[分钟[useconds]][秒]]
否定一个字节,应该之一:0 x00为“+”,0 x01为“-”
小时-可选的可变长度编码unsigned64值小时
分钟-可选的可变长度编码unsigned64值分钟
秒-可选的可变长度编码unsigned64值为秒
useconds -可选的可变长度编码unsigned64值微秒
protobuf编码的<一个class="ulink" href="https://developers.google.com/protocol-buffers/docs/encoding" target="_top">https://developers.google.com/protocol-buffers/docs/encoding一个>。
小时,分钟,秒,useconds是可选的,如果所有右边的值是0。
例子:0 x00 - > + 00:00:00.000000
DATETIME
一个日期或日期和时间值。
价值
的序列变异,安排如下:
(| | | |年月日|小时| | |(分钟[| |秒[| useconds |]]]]
——可变长度编码unsigned64价值
月-可变长度编码unsigned64值
天-可变长度编码unsigned64价值
小时-可选的可变长度编码unsigned64值小时
分钟-可选的可变长度编码unsigned64值分钟
秒-可选的可变长度编码unsigned64值为秒
useconds -可选的可变长度编码unsigned64值微秒
小时,分钟,秒,useconds是可选的,如果所有右边的值是0。
.flags
的名字 | 位置 |
---|---|
is_timestamp | 1 |
小数
一个任意长度的数字。数字编码为一个字节表示小数点的位置是BCD编码数量紧随其后。是BCD用于简化转换与字符串和其他本地任意精度的数学数据类型。参见:BCD在包装<一个class="ulink" href="https://en.wikipedia.org/wiki/Binary-coded_decimal" target="_top">https://en.wikipedia.org/wiki/Binary-coded_decimal一个>
长处
最多可显示的小数位数(不包括小数点和迹象,但包括.fractional_digits
)。
应该在1 - 65的范围。
.fractional_digits
显示的小数位数的长度。
的范围应该在0 - 30。
价值
字节顺序如下:
规模| BCD +标志(0 x00) ?
规模- 8位刻度值后的十进制数字(“。”)
BCD - BCD编码位数为每个数字(4位)
4位符号,符号编码(xc = " + ", 0 xd =“-”)
0 x0,最后4位如果长度(数字)% 2 = = 0
例子:x04 0 x12 0 x34 0 x01 0 xd0 - > -12.3401
集
字符串代表一组值的列表。
价值
0或多个protobuf的字节序列(前缀八位字节长度)或一个特殊的序列与一个预定义的意思下面列出。
[0]
——空值
[1]0 x00
一组包含一个空字符串”
[1]0 x01
——这是一个无效的值,但是是被视为空集
[2]0 x01 0 x00
——一套与单个项目,' 0 '字符
[8]0 x03 F O O 0 x03 B R
——一套2项:FOO,酒吧
列的名称
的名字列在一个别名
表的列的名称源于
表的列的名称源于前一个别名是应用
模式列源于
目录模式源于
由于当前不支持目录在MySQL,别指望这个字段设置。在MySQL C / S协议字段的值def
所有的时间。
显示的小数位数为浮点和定点数字
.type最大可显示的字符数
.type
特定的标志
类型 | 价值 | 描述 |
---|---|---|
使用UINT | 0 x0001 | 补零 |
双 | 0 x0001 | 无符号 |
浮动 | 0 x0001 | 无符号 |
小数 | 0 x0001 | 无符号 |
字节 | 0 x0001 | rightpad |
价值 | 描述 |
---|---|
0 x0010 | NOT_NULL |
0 x0020 | PRIMARY_KEY |
0 x0040 | UNIQUE_KEY |
0 x0080 | MULTIPLE_KEY |
0 x0100 | AUTO_INCREMENT |
默认值:0
一个提示的高级编码字节字段
类型 | 价值 | 描述 |
---|---|---|
字节 | 0 x0001 | 几何(WKB编码) |
字节 | 0 x0002 | JSON(文本编码) |
字节 | 0 x0003 | XML(文本编码) |
这个列表并不全面。指南:预计该字段的值通过验证器检查客户机和服务器如果这个字段设置。如果服务器增加了更多的内部数据类型依赖BLOB存储图像处理,寻求在BLOB、复杂类型和类型将被添加。
消息ColumnMetaData {enum FieldType{它们= 1;使用UINT = 2;双= 5;浮动= 6;字节= 7;时间= 10;DATETIME = 12;设置= 15;ENUM = 16;位= 17; DECIMAL = 18; } // datatype of the field in a row required FieldType type = 1; optional bytes name = 2; optional bytes original_name = 3; optional bytes table = 4; optional bytes original_table = 5; optional bytes schema = 6; optional bytes catalog = 7; optional uint64 collation = 8; optional uint32 fractional_digits = 9; optional uint32 length = 10; optional uint32 flags = 11; optional uint32 content_type = 12; }
表达式语法
expr是SQL的基本结构在各种地方语言:
选择< expr >作为…
其中< expr >
可以使用结构:
建立一个MySQL服务器条目树
生成SQL从它
在CRUD作为过滤条件Find ()
,Update ()
,Delete ()
调用。
表达式
表达式树的“根”。
如果表达式类型占位符,那么它的值是指当执行一个语句(参见指定一个参数arg游戏领域的StmtExecute命令)。场位置(必须存在这样一个表达式)提供基于位置的参数在参数列表中。
消息Expr{枚举类型{鉴别= 1;文字= 2;变量= 3;FUNC_CALL = 4;运算符= 5;占位符= 6;对象= 7;数组= 8;};所需类型类型= 1; optional ColumnIdentifier identifier = 2; optional string variable = 3; optional Mysqlx.Datatypes.Scalar literal = 4; optional FunctionCall function_call = 5; optional Operator operator = 6; optional uint32 position = 7; optional Object object = 8; optional Array array = 9; }
col_identifier(表):<一个class="ulink" href="mailto:col@doc_path" target="_top">col@doc_path一个>,<一个class="ulink" href="mailto:tbl.col@doc_path" target="_top">tbl.col@doc_path一个>上校,资源描述。schema.tbl坳。坳col_identifier(文档):doc_path
消息ColumnIdentifier {Mysqlx.Expr重复。DocumentPathItem document_path = 1;可选的字符串名称= 2;可选的字符串table_name = 3;可选的字符串schema_name = 4;}
接线员:< < (a, b)
那些运营商实现列表(区分大小写):
*
默认的
!
sign_plus
sign_minus
~
& &
| |
xor
= =
! =
>
> =
<
< =
&
|
^
< <
> >
+
- - - - - -
*
/
div
%
是
is_not
正则表达式
not_regexp
就像
not_like
投
在
(参数[0](param [1], param [2],…))
not_in
(参数[0]不是(param [1], param [2],…))
之间的
between_not
date_add
date_sub
微秒
第二个
一分钟
小时
一天
周
月
季度
一年
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
二进制((N))
CHAR ((N))
日期
DATETIME
小数((M [D]))
JSON
签署(整数)
时间
无符号(整数)
消息操作符{所需的字符串名称= 1;重复Expr参数= 2;}
一个标量。
消息标量与字符集{/ /字符串/排序消息字符串{所需字节值= 1;可选uint64排序= 2;};/ /一个不透明的八隅体序列,用一个可选的content_type / /看到‘Mysqlx.Resultset。ColumnMetadata ' '为已知值的列表。消息八位字节{所需字节值= 1;可选uint32 content_type = 2;};枚举类型{V_SINT = 1;V_UINT = 2;V_NULL = 3; V_OCTETS = 4; V_DOUBLE = 5; V_FLOAT = 6; V_BOOL = 7; V_STRING = 8; }; required Type type = 1; optional sint64 v_signed_int = 2; optional uint64 v_unsigned_int = 3; // 4 is unused, was Null which doesn't have a storage anymore optional Octets v_octets = 5; optional double v_double = 6; optional float v_float = 7; optional bool v_bool = 8; optional String v_string = 9; }