client-serverプロトコル for MySQL 4.1++

相変わらずJDBC 4.0でのlong型引数対応で悩んでいるのだけれども,client-sideのPreparedStatementの場合に2^31以上のサイズのパラメータをPreparedStatementオブジェクトで引き受けることができると仮定した場合,MySQLのclient-serverプロトコル的にはどうなのか?という話.

MySQLのclient-serverプロトコルについての資料を見るに,
1) http://www.redferni.uklinux.net/mysql/MySQL-Protocol.html
2) http://dev.mysql.com/doc/internals/en/the-packet-header.html
3) http://dev.mysql.com/doc/internals/en/command-packet.html

通常のSQL文を送るのに使用するのは"Command Packet"で,1)のところを見ると

Bytes                 Name
-----                 ----
3                     Packet Length
1                     Packet Number

Packet Length: The length, in bytes, of the packet
               that follows the Packet Header. There
               may be some special values in the most
               significant byte. Since 2**24 = 16MB,
               the maximum packet length is 16MB.
       
Packet Number: A serial number which can be used to
               ensure that all packets are present
               and in order. The first packet of a
               client query will
               have Packet Number = 0. Thus, when a
               new SQL statement starts, the packet
               number is re-initialised.

各Packetで送れるのは16MBまでだけど,Packet Numberを使うことで16MB * 8bit = 4GBまでは送れるわけだね.

でもそれを超えるサイズのものは送れないということか.MMの言ってた通りだ.(2^32まで).

ちなみにserver-side PreparedStatementの方はこうしたサイズ制限は無いらしい.そっちも今から調べて書きます.

ということでC/Jのclient-side PreparedStatementに関しては,JDBC 4.0対応時であっても2^32byte=4GB制限は残るということでOKだね.

まあ4GBってのがInteger.MAX_VALUEに1足して2倍した数字というのはちょっと面倒くさいところだけれども.