mysql — 客户端与服务端之间的能力谈判
我们在了解mysql网络通信协议时,在客户端与服务器在初次连接的时候,服务器会先发送一个握手初始包,其内部字段如图所示:
可以看到服务器在向客户端传递自己的信息,比如自己的版本/状态/字符编码/以及后面登录认证需要用到的挑战随机数/还有权能
标志位 我们今天的主题就是权能标志位! 客户端和服务器使用权能标志位来指示自己支持和想要使用那些功能.
服务端在发送初始化握手包时会将自己支持的功能在16位服务器权能标志位上面对应位置置位. 然后客户端接收到服务器发送过来的
初始化报文之后,会对服务器发送的权能标志进行修改,保留自身所支持的功能,然后将权能标志返回给服务器,从而保证服务器与
客户端通讯的兼容性.
那么这么多标志位的作用都是什么呢? 了解一下:
Protocol::CapabilityFlags:
CLIENT_LONG_PASSWORD
Use the improved version of Old Password Authentication.
Value
0x00000001
CLIENT_FOUND_ROWS
Send found rows instead of affected rows in EOF_Packet.
Value
0x00000002
CLIENT_LONG_FLAG
Longer flags in Protocol::ColumnDefinition320.
Value
0x00000004
Server
Supports longer flags.
Client
Expects longer flags.
CLIENT_CONNECT_WITH_DB
Database (schema) name can be specified on connect in Handshake Response Packet.
Value
0x00000008
Server
Supports schema-name in Handshake Response Packet.
Client
Handshake Response Packet contains a schema-name.
CLIENT_NO_SCHEMA
Value
0x00000010
Server
Do not permit database.table.column.
CLIENT_COMPRESS
Compression protocol supported.
Value
0x00000020
Server
Supports compression.
Client
Switches to Compression compressed protocol after successful authentication.
CLIENT_ODBC
Value
0x00000040
Special handling of ODBC behavior.
Note
No special behavior since 3.22.
CLIENT_LOCAL_FILES
Can use LOAD DATA LOCAL.
Value
0x00000080
Server
Enables the LOCAL INFILE request of LOAD DATA|XML.
Client
Will handle LOCAL INFILE request.
CLIENT_IGNORE_SPACE
Value
0x00000100
Server
Parser can ignore spaces before '('.
Client
Let the parser ignore spaces before '('.
CLIENT_PROTOCOL_41
Value
0x00000200
Server
Supports the 4.1 protocol.
Client
Uses the 4.1 protocol.
Note
this value was CLIENT_CHANGE_USER in 3.22, unused in 4.0
CLIENT_INTERACTIVE
wait_timeout versus wait_interactive_timeout.
Value
0x00000400
Server
Supports interactive and noninteractive clients.
Client
Client is interactive.
See
mysql_real_connect()
CLIENT_SSL
Value
0x00000800
Server
Supports SSL.
Client
Switch to SSL after sending the capability-flags.
CLIENT_IGNORE_SIGPIPE
Value
0x00001000
Client
Do not issue SIGPIPE if network failures occur (libmysqlclient only).
See
mysql_real_connect()
CLIENT_TRANSACTIONS
Value
0x00002000
Server
Can send status flags in EOF_Packet.
Client
Expects status flags in EOF_Packet.
Note
This flag is optional in 3.23, but always set by the server since 4.0.
CLIENT_RESERVED
Unused.
Value
0x00004000
Note
Was named CLIENT_PROTOCOL_41 in 4.1.0.
CLIENT_SECURE_CONNECTION
Value
0x00008000
Server
Supports Authentication::Native41.
Client
Supports Authentication::Native41.
CLIENT_MULTI_STATEMENTS
Value
0x00010000
Server
Can handle multiple statements per COM_QUERY and COM_STMT_PREPARE.
Client
May send multiple statements per COM_QUERY and COM_STMT_PREPARE.
Note
Was named CLIENT_MULTI_QUERIES in 4.1.0, renamed later.
Requires
CLIENT_PROTOCOL_41
Value
0x00020000
Server
Can send multiple resultsets for COM_QUERY.
Client
Can handle multiple resultsets for COM_QUERY.
Requires
CLIENT_PROTOCOL_41
CLIENT_PS_MULTI_RESULTS
Server
Can send multiple resultsets for COM_STMT_EXECUTE.
Client
Can handle multiple resultsets for COM_STMT_EXECUTE.
Value
0x00040000
Requires
CLIENT_PROTOCOL_41
CLIENT_PLUGIN_AUTH
Value
0x00080000
Server
Sends extra data in Initial Handshake Packet and supports the pluggable authentication protocol.
Client
Supports authentication plugins.
Requires
CLIENT_PROTOCOL_41
CLIENT_CONNECT_ATTRS
Value
0x00100000
Server
Permits connection attributes in Protocol::HandshakeResponse41.
Client
Sends connection attributes in Protocol::HandshakeResponse41.
CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA
Value
0x00200000
Server
Understands length-encoded integer for auth response data in Protocol::HandshakeResponse41.
Client
Length of auth response data in Protocol::HandshakeResponse41 is a length-encoded integer.
Note
The flag was introduced in 5.6.6, but had the wrong value.
CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS
Value
0x00400000
Server
Announces support for expired password extension.
Client
Can handle expired passwords.
CLIENT_SESSION_TRACK
Value
0x00800000
Server
Can set SERVER_SESSION_STATE_CHANGED in the Status Flags and send session-state change data after a OK packet.
Client
Expects the server to send sesson-state changes after a OK packet.
CLIENT_DEPRECATE_EOF
Value
0x01000000
Server
Can send OK after a Text Resultset.
Client
Expects an OK (instead of EOF) after the resultset rows of a Text Resultset.
Background
To support CLIENT_SESSION_TRACK, additional information must be sent after all successful commands. Although the OK packet is extensible, the EOF packet is not due to the overlap of its bytes with the content of the Text Resultset Row.
Therefore, the EOF packet in the Text Resultset is replaced with an OK packet. EOF packets are deprecated as of MySQL 5.7.5.