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倍した数字というのはちょっと面倒くさいところだけれども.