{"id":11487,"date":"2014-11-07T13:11:10","date_gmt":"2014-11-07T04:11:10","guid":{"rendered":"http:\/\/labs.gree.jp\/blog\/?p=11487"},"modified":"2014-11-07T13:11:10","modified_gmt":"2014-11-07T04:11:10","slug":"mysql%e3%83%a6%e3%83%bc%e3%82%b6%e3%81%ae%e3%81%9f%e3%82%81%e3%81%aemysql%e3%83%97%e3%83%ad%e3%83%88%e3%82%b3%e3%83%ab%e5%85%a5%e9%96%803","status":"publish","type":"post","link":"https:\/\/labs.gree.jp\/blog\/2014\/11\/11487\/","title":{"rendered":"MySQL\u30e6\u30fc\u30b6\u306e\u305f\u3081\u306eMySQL\u30d7\u30ed\u30c8\u30b3\u30eb\u5165\u9580#3"},"content":{"rendered":"<p>\u307f\u306a\u3055\u3093\u9023\u4f11\u306f\u3069\u3046\u3067\u3057\u305f\u304b\uff1f\u79c1\u306f\u3068\u3044\u3046\u3082\u306e\u305a\u30fc\u3063\u3068\u5bb6\u306b\u5f15\u304d\u3053\u3082\u3063\u3066cloudbit\u3067ssh\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u305f\u308a\u3057\u3066\u904a\u3093\u3067\u3044\u307e\u3057\u305f\u3002<br \/>\n\u4eca\u65e5\u306e\u8a18\u4e8b\u3067\u306fMySQL Server\u306b\u5bfe\u3057\u3066\u30b3\u30de\u30f3\u30c9\u3092\u767a\u884c\u3057\u3066\u7d50\u679c\u3092\u53d6\u5f97\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p>\u57fa\u672c\u7684\u306b\u30b3\u30de\u30f3\u30c9\u306e\u5b9f\u884c\u306e\u6d41\u308c\u3092\u6700\u5c0f\u3067\u8ffd\u3063\u3066\u307f\u3088\u3046\u3001\u3068\u3044\u3046\u8da3\u65e8\u306a\u306e\u3067\u7d30\u304b\u3044\u5206\u5c90\u3084\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306a\u3069\u306f\u7701\u3044\u3066\u3044\u307e\u3059\u306e\u3067\u3042\u3057\u304b\u3089\u305a\u3002<\/p>\n<h3 id=\"hs_609eb923d7b0f09c3ae6889a5545027e_header_0\"> Select Query\u3092\u6295\u3052\u3066\u307f\u3088\u3046<\/h3>\n<p>Query\u306e\u5b9f\u884c\u306fMySQL\u30b5\u30fc\u30d0\u30fc\u306b\u5bfe\u3057\u3066<a href=\"http:\/\/dev.mysql.com\/doc\/internals\/en\/com-query.html\">COM_QUERY<\/a>\u30b3\u30de\u30f3\u30c9\u3092\u9001\u4fe1\u3059\u308b\u3068\u7d50\u679c\u304c\u5e30\u3063\u3066\u304d\u307e\u3059\u3002<\/p>\n<p>\u5927\u307e\u304b\u306a\u30b7\u30fc\u30b1\u30f3\u30b9\u3068\u3057\u3066\u306f<a href=\"http:\/\/dev.mysql.com\/doc\/internals\/en\/com-query-response.html\">dev.mysql.com<\/a>\u306b\u8a18\u8f09\u306e\u901a\u308a\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u56f3\u3067\u3044\u3046\u3068\u4e00\u756a\u5de6\u306e\u5206\u5c90\u3067\u3059\u3002Select Query\u3092\u5b9f\u884c\u3059\u308b\u3060\u3051\u3067\u3059\u306e\u3067\u3001ProtocolText::Resultset\u304c\u5e30\u3063\u3066\u304f\u308b\u3053\u3068\u304c\u671f\u5f85\u3067\u304d\u305d\u3046\u3067\u3059\u306d\u3002<\/p>\n<p>\u7c21\u5358\u306a\u56f3\u306b\u3059\u308b\u3068\u3053\u3093\u306a\u611f\u3058\u306e\u9806\u756a\u3067\u30c7\u30fc\u30bf\u304c\u3084\u3063\u3066\u304d\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/labs.gree.jp\/blog\/wp-content\/uploads\/2014\/11\/Screen-Shot-2014-11-06-at-4.28.13-PM.png\" alt=\"Screen Shot 2014-11-06 at 4.28.13 PM\" width=\"625\" height=\"449\" class=\"aligncenter size-full wp-image-11503\" \/><\/p>\n<p>\u8aac\u660e\u306f\u307b\u3069\u307b\u3069\u306b\u3057\u3066\u304a\u3044\u3066\u3001\u307e\u305a\u306fMySQL\u306b\u9069\u5f53\u306a\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3092\u3064\u3063\u3053\u3093\u3067\u304a\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"superpre \">\nmysql -uroot -e 'create database ex;'\nmysql -uroot -e 'create table ex.ex1(id int unsigned primary key auto_increment, name varchar(255));'\nmysql -uroot -e 'insert into ex.ex1(name) values(\"petrucci\"), (\"adam\"), (\"belushi\");'<\/pre>\n<p>ngrep\u3067\u30d1\u30b1\u30c3\u30c8\u3092\u78ba\u8a8d\u3057\u3064\u3064\u3001\u30c6\u30fc\u30d6\u30eb\u306e\u4e2d\u8eab\u3092\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"superpre \">\nchobie% sudo ngrep -x -q -d lo0 '' 'port 3306'\ninterface: lo0 (127.0.0.0\/255.0.0.0)\nfilter: (ip or ip6) and ( port 3306 )<\/pre>\n<p>select\u3092\u5b9f\u884c\u3057\u3066\u307f\u307e\u3059<\/p>\n<pre class=\"superpre \">\nchobie% mysql -uchobie -p -e 'select * from ex.ex1'\nEnter password: \n+----+----------+\n| id | name     |\n+----+----------+\n|  1 | petrucci |\n|  2 | adam     |\n|  3 | belushi  |\n+----+----------+<\/pre>\n<p>ngrep\u306e\u7d50\u679c\u306f\u5168\u3066\u4e57\u305b\u308b\u3068\u9577\u304f\u306a\u3063\u3066\u3057\u307e\u3046\u306e\u3067\u4eca\u56de\u306e\u8208\u5473\u304c\u3042\u308b\u90e8\u5206\u3060\u3051\u629c\u7c8b\u3057\u3066\u307f\u307e\u3059\u3002<br \/>\n<\/p>\n<pre class=\"superpre \">\n~~~~~\u5272\u611b\n\nT 127.0.0.1:49688 -> 127.0.0.1:3306 [AP]\n  15 00 00 00 03 73 65 6c    65 63 74 20 2a 20 66 72    .....select * fr\n  6f 6d 20 65 78 2e 65 78    31                         om ex.ex1       \n\nT 127.0.0.1:3306 -> 127.0.0.1:49688 [AP]\n  01 00 00 01 02 22 00 00    02 03 64 65 66 02 65 78    .....\"....def.ex\n  03 65 78 31 03 65 78 31    02 69 64 02 69 64 0c 3f    .ex1.ex1.id.id.?\n  00 0a 00 00 00 03 23 42    00 00 00 26 00 00 03 03    ......#B...&....\n  64 65 66 02 65 78 03 65    78 31 03 65 78 31 04 6e    def.ex.ex1.ex1.n\n  61 6d 65 04 6e 61 6d 65    0c 08 00 ff 00 00 00 fd    ame.name........\n  00 00 00 00 00 05 00 00    04 fe 00 00 22 00 0b 00    ............\"...\n  00 05 01 31 08 70 65 74    72 75 63 63 69 07 00 00    ...1.petrucci...\n  06 01 32 04 61 64 61 6d    0a 00 00 07 01 33 07 62    ..2.adam.....3.b\n  65 6c 75 73 68 69 05 00    00 08 fe 00 00 22 00       elushi.......\". \n\nT 127.0.0.1:49688 -> 127.0.0.1:3306 [AP]\n  01 00 00 00 01                                        .....  <\/pre>\n<p>\u305d\u306e\u307e\u307e\u3067\u3082\u306a\u3093\u3068\u306a\u304f\u8aad\u3081\u3061\u3083\u3044\u305d\u3046\u306a\u7d50\u679c\u3067\u3059\u306d\u3002<\/p>\n<h3 id=\"hs_609eb923d7b0f09c3ae6889a5545027e_header_1\"> COM_QUERY<\/h3>\n<p>\u305d\u308c\u3067\u306f\u307e\u305a\u306fClient\u304b\u3089\u6295\u3052\u308bMySQL Packet\u3092\u5206\u89e3\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"superpre \">\nT 127.0.0.1:49688 -> 127.0.0.1:3306 [AP]\n  15 00 00 00 03 73 65 6c    65 63 74 20 2a 20 66 72    .....select * fr\n  6f 6d 20 65 78 2e 65 78    31         <\/pre>\n<p>\u5148\u982d4byte\u306fMySQL Packet\u306eheader\u306a\u306e\u3067payload\u3068\u5206\u5272\u3059\u308b\u3068\u4e0b\u8a18\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"superpre \">\nMySQL Packet header: 15 00 00 00\nPayload(COM_QUERY): 03 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 65 78 2e 65 78 31<\/pre>\n<p>dev.mysql.com\u306e<a href=\"http:\/\/dev.mysql.com\/doc\/internals\/en\/com-query.html\">COM_QUERY<\/a>\u306e\u89e3\u8aac\u306b\u3088\u308b\u3068COM_QUERY\u306f<br \/>\n1byte\u306e0x03\u304c\u8b58\u5225\u5b50\u3067\u6b8b\u308a\u306fstring[EOF]\u306equery\u3068\u306a\u308a\u307e\u3059\u3002string[EOF]\u306fpayload\u306e\u6b8b\u308a\u5168\u90e8\u304c\u6587\u5b57\u5217\u3067\u3042\u308b\u3068\u3044\u3046\u610f\u5473\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/labs.gree.jp\/blog\/wp-content\/uploads\/2014\/11\/Screen-Shot-2014-11-06-at-4.11.27-PM.png\" alt=\"com_query\" width=\"623\" height=\"105\" class=\"aligncenter size-full wp-image-11498\" \/><\/p>\n<p>\u305d\u308c\u3067\u306f\u65e9\u901fCOM_QUERY\u306eMySQL Packet\u3092\u3064\u304f\u308b\u95a2\u6570\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"lang:go decode:true \" >package main\n\nimport (\n\t\"encoding\/hex\"\n\t\"fmt\"\n)\n\nfunc com_query(query string) []byte {\n\tpayload_size := len(query) + 1\n\tbuffer := make([]byte, payload_size+4)\n\tbuffer[0] = byte(payload_size)\n\tbuffer[1] = byte(payload_size &gt;&gt; 8)\n\tbuffer[2] = byte(payload_size &gt;&gt; 16)\n\tbuffer[3] = 0x00 \/\/ Sequence ID\n\tbuffer[4] = 0x03 \/\/ COM_QUERY\n\tcopy(buffer[5:], query)\n\n\treturn buffer\n}\n\n\/\/ create COM_QUERY MySQL packet\nfunc main() {\n\tresult := com_query(\"select * from ex.ex1\")\n\tfmt.Printf(\"[result]:\\n%s\\n\", hex.Dump(result))\n}\n\n\/\/[result]:\n\/\/00000000  15 00 00 00 03 73 65 6c  65 63 74 20 2a 20 66 72  |.....select * fr|\n\/\/00000010  6f 6d 20 65 78 2e 65 78  31                       |om ex.ex1|\n<\/pre>\n<p><\/p>\n<p>\u3053\u306e\u30b3\u30fc\u30c9\u306f<a href=\"http:\/\/play.golang.org\/p\/7zpDRRAgRQ\">PlayGround<\/a>\u3067\u8a66\u305b\u307e\u3059\u3001\u304c\u3042\u307e\u308a\u306b\u3082\u30b7\u30f3\u30d7\u30eb\u904e\u304e\u308b\u306e\u3067\u7279\u306b\u3044\u3046\u3053\u3068\u306a\u3044\u3067\u3059\u306d\u3002<br \/>\n<\/p>\n<p>\u305d\u308c\u3067\u306f\u3001\u5f15\u304d\u7d9a\u304d\u7d50\u679c\u30bb\u30c3\u30c8\u3092Parse\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046<\/p>\n<h3 id=\"hs_609eb923d7b0f09c3ae6889a5545027e_header_2\"> COM_QUERY Response<\/h3>\n<p>COM_QUERY\u306eResponse\u3067\u306f\u7d50\u679c\u3068\u3057\u3066\u53d6\u308a\u3046\u308b\u5024\u304c\u6570\u30d1\u30bf\u30fc\u30f3\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>MySQL Packet\u306e1byte\u76ee\u306b\u3088\u3063\u3066\u4e0b\u8a18\u306e\u901a\u308a\u306b\u5206\u5c90\u3057\u307e\u3059\u3002SELECT\u306e\u5834\u5408\u306fLength Encoded Integer\u306e\u5024\u304c\u5e30\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"superpre \">\n0xff => Error Packet\n0x00 => OK Packet(UPDATE\u3068\u304bINSERT\u306e\u6642\u306b\u5e30\u3063\u3066\u304f\u308b)\n0xfb => GET_MORE_CLIENT_DATA (\u78ba\u304bload data local infile\u306e\u5834\u5408)\n\u305d\u308c\u4ee5\u5916 => Length Encoded Integer\u3067\u7d50\u679c\u30bb\u30c3\u30c8\u306e\u30ab\u30e9\u30e0\u6570\u304c\u5165\u308b<\/pre>\n<p>\u306f\u3066\u3001Length Encoded Integer\u3068\u306f\u4f55\u3067\u3057\u3087\u3046\u304b\uff1f<\/p>\n<h3 id=\"hs_609eb923d7b0f09c3ae6889a5545027e_header_3\"> Length Encoded Integer<\/h3>\n<p>\u8aac\u660e\u3057\u3066\u3044\u307e\u305b\u3093\u3067\u3057\u305f\u304cMySQL protocol\u3067\u306e\u5024\u8868\u73fe\u306fLittle Endian\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\u3002<br \/>\n\u56fa\u5b9a\u9577\u306e\u5024\u8868\u73fe\u3060\u3051\u3067\u306f\u6642\u306b\u52b9\u7387\u7684\u3067\u306f\u306a\u3044\u4e8b\u3082\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u52b9\u7387\u6027\u3092\u3042\u3052\u305f\u308a\u3001\u8868\u73fe\u529b\u3092\u4e0a\u3052\u308b\u70ba\u306bMySQL Protocol\u3067\u306fLength Encoded Integer\u3068\u3044\u3046\u8868\u73fe\u304c\u3088\u304f\u4f7f\u308f\u308c\u307e\u3059\u3002<\/p>\n<p>Length Encoded integer\u306e1\u304b\u30899byte\u306b\u53ef\u5909\u3057\u30011byte\u76ee\u306e\u5024\u306b\u5fdc\u3058\u3067byte, int8 int16, int24, int64\u306e\u8868\u73fe\u304c\u3067\u304d\u307e\u3059\u3002<br \/>\n\u3056\u3063\u304f\u308a\u8a00\u3046\u3068250\u4ee5\u4e0b\u306e\u5024\u306f1byte\u3060\u3051\u3067\u8868\u73fe\u3067\u304d\u3001\u305d\u308c\u4ee5\u4e0a\u306e\u5834\u5408\u306f\u5024\u306e\u7bc4\u56f2\u306b\u5fdc\u3058\u305f\u30b5\u30a4\u30ba\u5206\u306e\u30c7\u30fc\u30bf\u304c\u304f\u3063\u3064\u304f\u3001\u3068\u3044\u3046\u30b7\u30f3\u30d7\u30eb\u306a\u69cb\u9020\u3067\u3059\u3002<\/p>\n<p>[1byte prefix]([n bytes if larger > 250])?<\/p>\n<pre class=\"superpre \">\n251: null \u3068\u304b\u3001\u5834\u5408\u306b\u3088\u3063\u3066\u7279\u5225\u306a\u610f\u5473\u3092\u6301\u305f\u305b\u305f\u308a\u3057\u307e\u3059\n252: uint16\n253: int24\n254: int64\n255: error packet<\/pre>\n<p>\u8208\u5473\u6df1\u3044\u70b9\u3068\u3057\u3066\u306f1byte\u76ee\u3092\u3046\u307e\u304ferror packet\u306b\u5408\u308f\u305b\u3066\u308b\u3068\u3053\u308d\u3067\u3059\u306d\u3002\u305d\u308c\u3067\u306flength encoded integer(lenenc int)\u3092\u8aad\u307f\u8fbc\u3080\u95a2\u6570\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"lang:go decode:true \" >func read_lenenc_int(data []byte) (int64, int, error) {\n  var result int64\n  var read int = 1\n  var err error\n\n  switch data[0] {\n  case 0xfb:\n    return 0, read, fmt.Errorf(\"NULL\")\n  case 0xfc:\n    result = int64(binary.LittleEndian.Uint16(data[1:3]))\n    read = 3\n  case 0xfd:\n    result = int64(data[1])\n    result += int64(data[2] &lt;&lt; 8)\n    result += int64(data[3] &lt;&lt; 16)\n    read = 4\n  case 0xfe:\n    result = int64(binary.LittleEndian.Uint64(data[1:9]))\n    read = 9\n  case 0xff:\n    err = fmt.Errorf(\"Err packet\")\n  default:\n    result = int64(data[0])\n  }\n\n  return result, read, err\n}<\/pre>\n<p>\u57fa\u672c\u7684\u306b\u306fprefix + \u5b9f\u30c7\u30fc\u30bf\u5f62\u5f0f\u3068\u306a\u308b\u306e\u3067\u305d\u306e\u307e\u307eparse\u3067\u304d\u307e\u3059\u3002Go\u306ebinary\u30d1\u30c3\u30b1\u30fc\u30b8\u306b\u306fUint24\u3068\u3044\u3046\u306e\u306f\u306a\u3044\u306e\u3067<br \/>\n\u305d\u3053\u3060\u3051\u81ea\u524d\u3067\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059\u304cparse\u306f\u7c21\u5358\u3067\u3059\u306d\u3002<br \/>\n<\/p>\n<p>\u3064\u3044\u3067\u306b\u3001\u6587\u5b57\u5217\u3092\u8868\u73fe\u3059\u308bLength Encoded String\u3068\u3044\u3046\u306e\u3082\u3042\u308b\u306e\u3067\u3053\u306e\u95a2\u6570\u3082\u4f5c\u3063\u3068\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"lang:go decode:true \" >func read_lenenc_str(data []byte) (string, int, error) {\n\tvar result []\n\tlength, offset, err := read_lenenc_int(data)\n\tif err != nil {\n\t\treturn result, 0, err\n\t}\n\n\tresult = data[offset:offset+length]\n\treturn string(result), offset+length, nil\n}<\/pre>\n<p><\/p>\n<p>\u898b\u3066\u5206\u304b\u308b\u901a\u308a\u30c7\u30fc\u30bf\u90e8\u5206\u306eprefix\u306bLength Encoded Integer\u304c\u4ed8\u3044\u3066\u3044\u308b\u3060\u3051\u3067\u3059\u3002<\/p>\n<p>\u3053\u308c\u3089\u306e\u95a2\u6570\u306f<a href=\"http:\/\/play.golang.org\/p\/rdkJfGSX4W\">PlayGround<\/a>\u3067\u78ba\u8a8d\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u3042\u308a\u307e\u3059\u306e\u3067\u3044\u3058\u3063\u3066\u307f\u308b\u3068\u7406\u89e3\u3057\u3084\u3059\u3044\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>Length Encoded Integer\u306e\u89e3\u8aac\u306f\u3053\u308c\u304f\u3089\u3044\u306b\u3057\u3066\u30af\u30a8\u30ea\u7d50\u679c\u306e\u7d9a\u304d\u306e\u89e3\u8aac\u3067\u3059\u3002<\/p>\n<h3 id=\"hs_609eb923d7b0f09c3ae6889a5545027e_header_4\"> COM_QUERY Response\u306e\u7d9a\u304d<\/h3>\n<p>Select Query\u306e\u7d50\u679c\u306e\u5834\u5408\u306f\u3060\u3044\u305f\u3044Length Encoded Integer\u3067\u30ab\u30e9\u30e0\u6570\u304c\u5e30\u3063\u3066\u304f\u308b\u3001\u3068\u3044\u3046\u3068\u3053\u308d\u307e\u3067\u8aac\u660e\u3057\u307e\u3057\u305f\u3002<br \/>\n\u4eca\u5ea6\u306f\u30ab\u30e9\u30e0\u5b9a\u7fa9\u304b\u3089\u7d50\u679c\u30bb\u30c3\u30c8\u90e8\u5206\u3092parse\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"superpre \">\nT 127.0.0.1:3306 -> 127.0.0.1:49688 [AP]\n  01 00 00 01 02 22 00 00    02 03 64 65 66 02 65 78    .....\"....def.ex\n  03 65 78 31 03 65 78 31    02 69 64 02 69 64 0c 3f    .ex1.ex1.id.id.?\n  00 0a 00 00 00 03 23 42    00 00 00 26 00 00 03 03    ......#B...&....\n  64 65 66 02 65 78 03 65    78 31 03 65 78 31 04 6e    def.ex.ex1.ex1.n\n  61 6d 65 04 6e 61 6d 65    0c 08 00 ff 00 00 00 fd    ame.name........\n  00 00 00 00 00 05 00 00    04 fe 00 00 22 00 0b 00    ............\"...\n  00 05 01 31 08 70 65 74    72 75 63 63 69 07 00 00    ...1.petrucci...\n  06 01 32 04 61 64 61 6d    0a 00 00 07 01 33 07 62    ..2.adam.....3.b\n  65 6c 75 73 68 69 05 00    00 08 fe 00 00 22 00       elushi.......\". <\/pre>\n<p>\u3053\u308c\u3092\u624b\u3067\u5206\u5272\u3057\u3066\u3044\u304f\u3068\u4e0b\u8a18\u306e\u901a\u308a\u3068\u306a\u308a\u307e\u3059\u3002\u5c11\u3057\u9577\u3044\u3067\u3059\u304c\u3001\u30ab\u30e9\u30e0\u5b9a\u7fa9\u3068\u7d50\u679c\u30bb\u30c3\u30c8\u306e\u8fd4\u5374\u3068EOF\u30d1\u30b1\u30c3\u30c8\u306e3\u30d1\u30bf\u30fc\u30f3\u3060\u3051\u306a\u306e\u3067\u305f\u3093\u305f\u3093\u3068\u3044\u3051\u307e\u3059<\/p>\n<pre class=\"superpre \">\n# \u7d50\u679c\u30bb\u30c3\u30c8\u306e\u30ab\u30e9\u30e0\u6570 \nMySQL Packet Header: 01 00 00 01 (payload 1byte, sequence id = 1)\nLength Encoded Integer: 02 (\u7d50\u679c\u30bb\u30c3\u30c8\u306f\u306erow\u306f2\u30ab\u30e9\u30e0\u6301\u3063\u3066\u3044\u308b)\n\n\n# \u7d50\u679c\u30bb\u30c3\u30c8\u306e\u30ab\u30e9\u30e0\u5b9a\u7fa9\nMYSQL Packet Header: 22 00 00 02 (payload 34byte, sequence id = 2)\nPayload: 03 64 65 66 02 65 78 03 65 78 31 03 65 78 31 02 69 64 02 69 64 0c 3f 00 0a 00 00 00 03 23 42 00 00 00\n\n# \u7d50\u679c\u30bb\u30c3\u30c8\u306e\u30ab\u30e9\u30e0\u5b9a\u7fa9\nMySQL Packet Header: 26 00 00 03 (payload 40byte, sequence id = 3)\nPayload: 03 64 65 66 02 65 78 03 65 78 31 03 65 78 31 04 6e 61 6d 65 04 6e 61 6d 65 0c 08 00 ff 00 00 00 fd 00 00 00 00 00 05\n\n# \u30ab\u30e9\u30e0\u5b9a\u7fa9\u306e\u9001\u4fe1\u7d42\u4e86\nMySQL Packet Header: 05 00 00    04 (payload 5byte, sequence id = 4)\nEOF Packet: fe 00 00 22 00\n\n\n# \u7d50\u679c\u30bb\u30c3\u30c8(1\u884c\u76ee)\nMySQL Packet Header: 0b 00 00 05 (payload 11byte, sequence id = 5)\nPayload: 01 31 08 70 65 74    72 75 63 63 69\n\n# \u7d50\u679c\u30bb\u30c3\u30c8(2\u884c\u76ee)\nMySQL Packet Header: 07 00 00 06 (payload 7byte, sequence id = 6)\nPayload: 01 32 04 61 64 61 6d\n\n# \u7d50\u679c\u30bb\u30c3\u30c8(3\u884c\u76ee)\nMySQL Packet Header: 0a 00 00 07 (payload 10byte, sequence id = 7)\nPayload: 01 33 07 62 65 6c 75 73 68 69\n\n# \u7d50\u679c\u30bb\u30c3\u30c8\u306e\u9001\u4fe1\u7d42\u4e86\nMySQL Packet Header: 05 00 00 08 (Payload 5byte, sequence id = 8)\nEOF Packet: fe 00 00 22 00<\/pre>\n<p><\/p>\n<p>\u305d\u308c\u3067\u306f\u30ab\u30e9\u30e0\u5b9a\u7fa9\u90e8\u5206\u304b\u3089\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<h3 id=\"hs_609eb923d7b0f09c3ae6889a5545027e_header_5\"> \u7d50\u679c\u30bb\u30c3\u30c8\u306e\u30ab\u30e9\u30e0\u5b9a\u7fa9<\/h3>\n<p>\u30ab\u30e9\u30e0\u5b9a\u7fa9\u306e\u30d1\u30b1\u30c3\u30c8\u306f<a href=\"http:\/\/dev.mysql.com\/doc\/internals\/en\/com-query-response.html#packet-Protocol::ColumnDefinition\">ColumnDefinition<\/a>\u3068\u3044\u3063\u3066\u3001\u30c7\u30fc\u30bf\u5b9a\u7fa9\u90e8\u5206\u3092\u5f15\u7528\u3059\u308b\u3068:<\/p>\n<pre class=\"superpre \">\nlenenc_str     catalog\nlenenc_str     schema\nlenenc_str     table\nlenenc_str     org_table\nlenenc_str     name\nlenenc_str     org_name\nlenenc_int     length of fixed-length fields [0c]\n2              character set\n4              column length\n1              type\n2              flags\n1              decimals\n2              filler [00] [00]\n  if command was COM_FIELD_LIST {\nlenenc_int     length of default-values\nstring[$len]   default values\n  }<\/pre>\n<p>\u3068\u3042\u308b\u3088\u3046\u306bLength Encoded String\u3067\u30c6\u30fc\u30d6\u30eb\u540d\u3084\u30ab\u30e9\u30e0\u540d\u3068\u578b\u5b9a\u7fa9\u3001\u305d\u3057\u3066\u578b\u306e\u8a73\u7d30\u306b\u3064\u3044\u3066\u304c\u5165\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"superpre \">\nMYSQL Packet Header: 22 00 00 02 (payload 34byte, sequence id = 2)\nPayload: 03 64 65 66 02 65 78 03 65 78 31 03 65 78 31 02 69 64 02 69 64 0c 3f 00 0a 00 00 00 03 23 42 00 00 00\n\n[Column Definition]\n\tcatalog (03): 64 65 66 (def)\n\tschema (02): 65 78 (ex)\n\ttable (03): 65 78 31 (ex1)\n\torg_table (03): 65 78 31 (ex1)\n\tname (02): 69 64 (id)\n\torg_name (02): 69 64 (id)\n\tlength of fixed_length fields: 0c\n\tcharacter set: 3f 00 (binary)\n\tcolumn length: 0a 00 00 00 (10 byte)\n\ttype: 03 (Protocol::MYSQL_TYPE_LONG)\n\tflags: 23 42\n\tdecimals: 00\n\tfilter: 00 00<\/pre>\n<p><a href=\"http:\/\/dev.mysql.com\/doc\/internals\/en\/character-set.html#packet-Protocol::CharacterSet\">CharacterSet<\/a>\u3068<a href=\"http:\/\/dev.mysql.com\/doc\/internals\/en\/com-query-response.html#column-type\">ColumnType<\/a>\u306e\u5b9a\u7fa9\u306f\u3053\u306e\u30ea\u30f3\u30af\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002<\/p>\n<p>EOF Packet\u304c\u6765\u305f\u3089Column Definition\u90e8\u5206\u306f\u7d42\u4e86\u3067\u3059\u3002\u7d9a\u3044\u3066\u7d50\u679c\u30bb\u30c3\u30c8\u306b\u884c\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<h3 id=\"hs_609eb923d7b0f09c3ae6889a5545027e_header_6\"> \u7d50\u679c\u30bb\u30c3\u30c8<\/h3>\n<p>\u7d50\u679c\u30bb\u30c3\u30c8\u306e\u30d1\u30b1\u30c3\u30c8\u306f<a href=\"http:\/\/dev.mysql.com\/doc\/internals\/en\/com-query-response.html#packet-ProtocolText::ResultsetRow\">ResultsetRow<\/a>\u3068\u3044\u3044\u3001\u7d50\u679c\u30bb\u30c3\u30c8\u306e\u30ab\u30e9\u30e0\u306e\u6570\u3060\u3051Length Encoded String\u304c\u5e30\u3063\u3066\u304d\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u30012\u3064\u306e\u30ab\u30e9\u30e0\u304c\u3042\u308b\u3068\u3044\u3046\u306e\u304cCOM_QUERY\u306e\u6700\u521d\u306eResponse\u3067\u5e30\u3063\u3066\u304d\u3066\u3044\u308b\u306e\u30671\u884c\u306b\u306f2\u3064\u306e\u30ab\u30e9\u30e0\u304c\u5165\u3063\u3066\u3044\u307e\u3059\u3002<br \/>\n\u3068\u308a\u3042\u3048\u305a1\u884c\u3060\u3051\u624b\u3067parse\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"superpre \">\nMySQL Packet Header: 0b 00 00 05 (payload 11byte, sequence id = 5)\nPayload: 01 31 08 70 65 74    72 75 63 63 69\n\tcolumn0(01): 31 (1)\n\tcolumn1(08): 70 65 74 72 75 63 63 69 (petrucci)<\/pre>\n<p>Length Encoded String\u304c\u30ab\u30e9\u30e0\u6570\u5206\u9023\u7d9a\u3057\u3066\u3044\u308b\u3060\u3051\u306a\u306e\u3067Parse\u306f\u5358\u7d14\u3067\u3059\u306d\u3002\u6587\u5b57\u5217\u306e1\u3068petrucci\u3068\u3044\u3046\u5024\u304c\u9001\u3089\u3066\u304d\u3066\u3044\u307e\u3057\u305f\u3002<br \/>\nResultsetRow\u3082ColmunDefinition\u3068\u540c\u69d8\u306bEOF Packet\u304c\u304b\u3048\u3063\u3066\u304f\u308b\u307e\u3067\u7e70\u308a\u8fd4\u3057\u3066\u7d42\u4e86\u3067\u3059\u3002<\/p>\n<h3 id=\"hs_609eb923d7b0f09c3ae6889a5545027e_header_7\"> \u901a\u3057\u3067COM_QUERY\u3092\u30d7\u30ed\u30b0\u30e9\u30e0\u304b\u3089\u5b9f\u884c\u3057\u3066\u307f\u308b<\/h3>\n<p>\u524d\u56de\u306e\u8a18\u4e8b\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u4eca\u65e5\u306e\u90e8\u5206\u3092\u8ffd\u52a0\u3057\u3066\u307f\u305f\u306e\u304c\u3053\u3093\u306a\u611f\u3058\u3067\u3059\u3002<br \/>\nMySQL Packet\u306f\u8aad\u307f\u98db\u3070\u3057\u3084\u3059\u3044\u306e\u3067\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u5b9f\u88c5\u306b\u30c8\u30e9\u30a4\u30a2\u30f3\u30c9\u30a8\u30e9\u30fc\u3067\u3084\u308c\u308b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"lang:go decode:true \" >package main\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"crypto\/sha1\"\n\t\"encoding\/binary\"\n\t\"encoding\/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n)\n\nvar username = \"chobie\"\nvar password = \"chobie\"\n\ntype CapabilityFlag int\n\nvar (\n\tCLIENT_LONG_PASSWORD     CapabilityFlag = 0x0001\n\tCLIENT_FOUND_ROWS        CapabilityFlag = 0x0002\n\tCLIENT_LONG_FLAG         CapabilityFlag = 0x0004\n\tCLIENT_CONNECT_WITH_DB   CapabilityFlag = 0x0008\n\tCLIENT_NO_SCHEMA         CapabilityFlag = 0x0010\n\tCLIENT_COMPRESS          CapabilityFlag = 0x0020\n\tCLIENT_ODBC              CapabilityFlag = 0x0040\n\tCLIENT_LOCAL_FILES       CapabilityFlag = 0x0080\n\tCLIENT_IGNORE_SPACE      CapabilityFlag = 0x0100\n\tCLIENT_PROTOCOL_41       CapabilityFlag = 0x0200\n\tCLIENT_INTERACTIVE       CapabilityFlag = 0x0400\n\tCLIENT_SSL               CapabilityFlag = 0x0800\n\tCLIENT_IGNORE_SIGPIPE    CapabilityFlag = 0x1000\n\tCLIENT_TRANSACTIONS      CapabilityFlag = 0x2000\n\tCLIENT_RESERVED          CapabilityFlag = 0x4000\n\tCLIENT_SECURE_CONNECTION CapabilityFlag = 0x8000\n\tCLIENT_PLUGIN_AUTH       CapabilityFlag = 0x00080000\n\tCLIENT_SESSION_TRACK     CapabilityFlag = 0x00800000\n)\n\nfunc read_packet(reader io.Reader) (byte, byte) {\n\theader := make([]byte, 4)\n\treader.Read(header)\n\n\tpayload_size := uint32(header[0])\n\tpayload_size += uint32(header[1] &gt;&gt; 8)\n\tpayload_size += uint32(header[2] &gt;&gt; 16)\n\tpayload := make([]byte, payload_size)\n\n\treader.Read(payload)\n\treturn header, payload\n}\n\nfunc sha1_sum(data byte) byte {\n\th := sha1.New()\n\tio.Copy(h, bytes.NewReader(data))\n\n\treturn h.Sum(nil)\n}\n\nfunc read_lenenc_int(data []byte) (int64, int, error) {\n\tvar result int64\n\tvar read int = 1\n\tvar err error\n\n\tswitch data[0] {\n\tcase 0xfb:\n\t\treturn 0, read, fmt.Errorf(\"NULL\")\n\tcase 0xfc:\n\t\tresult = int64(binary.LittleEndian.Uint16(data[1:3]))\n\t\tread = 3\n\tcase 0xfd:\n\t\tresult = int64(data[1])\n\t\tresult += int64(data[2] &lt;&lt; 8)\n\t\tresult += int64(data[3] &lt;&lt; 16)\n\t\tread = 4\n\tcase 0xfe:\n\t\tresult = int64(binary.LittleEndian.Uint64(data[1:9]))\n\t\tread = 9\n\tcase 0xff:\n\t\terr = fmt.Errorf(\"Err packet\")\n\tdefault:\n\t\tresult = int64(data[0])\n\t}\n\n\treturn result, read, err\n}\n\nfunc read_lenenc_str(data []byte) (string, int, error) {\n\tvar result []byte\n\tlength, offset, err := read_lenenc_int(data)\n\tif err != nil {\n\t\treturn \"\", 0, err\n\t}\n\n\tresult = data[offset : int64(offset)+length]\n\treturn string(result), (int)(int64(offset) + length), nil\n}\n\nfunc com_query(query string) []byte {\n\tpayload_size := len(query) + 1\n\tbuffer := make([]byte, payload_size+4)\n\tbuffer[0] = byte(payload_size)\n\tbuffer[1] = byte(payload_size &gt;&gt; 8)\n\tbuffer[2] = byte(payload_size &gt;&gt; 16)\n\tbuffer[3] = 0x00\n\tbuffer[4] = 0x03 \/\/ COM_QUERY\n\tcopy(buffer[5:], query)\n\n\treturn buffer\n}\n\nfunc main() {\n\t\/\/READ INITIAL PACKET\n\tconn, err := net.Dial(\"tcp\", \"localhost:3306\")\n\treader := bufio.NewReader(conn)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\theader, payload := read_packet(reader)\n\tfmt.Printf(\"[header]:\\n%s\\n[payload]:\\n%s\\n\", hex.Dump(header), hex.Dump(payload))\n\n\t\/\/ INITIAL Packet\u306eparse\u3002\u524d\u56de\u3068\u5185\u5bb9\u540c\u3058\u306a\u306e\u3067\u3088\u307e\u306a\u304f\u3066\u5927\u4e08\u592b\n\toffset := 0\n\tprotocol_version := int(payload[offset])\n\tfmt.Printf(\"  [protocol_version]: %d\\n\", protocol_version)\n\toffset++\n\n\tfmt.Printf(\"  [Initial Handshake Packet]:\\n\")\n\tidx := bytes.IndexByte(payload[offset:], 0x00)\n\tversion := payload[offset : offset+idx]\n\tfmt.Printf(\"    [version]: %s\\n\", version)\n\toffset += idx + 1\n\n\tconnectionId := binary.LittleEndian.Uint32(payload[offset : offset+4])\n\tfmt.Printf(\"    [connectionId]: %d\\n\", connectionId)\n\toffset += 4\n\n\tauth_plugin_data_part1 := payload[offset : offset+8]\n\tfmt.Printf(\"    [auth_plugin_data_part1]: \\n\")\n\tfmt.Printf(\"    %s\", hex.Dump(auth_plugin_data_part1))\n\toffset += 8\n\n\tfilter1 := payload[offset : offset+1]\n\tfmt.Printf(\"    [filter1]: %s\\n\", filter1)\n\toffset += 1\n\n\tcapability_lower := payload[offset : offset+2]\n\toffset += 2\n\n\tcharset := uint8(payload[offset])\n\tfmt.Printf(\"    [charset]: %d\\n\", charset)\n\toffset++\n\n\tstatus := binary.LittleEndian.Uint16(payload[offset : offset+2])\n\tfmt.Printf(\"    [status]: %d\\n\", status)\n\toffset += 2\n\n\tcapability_upper := payload[offset : offset+2]\n\toffset += 2\n\tcapabilities := binary.LittleEndian.Uint32(append(capability_lower, capability_upper...))\n\n\tvar auth_plugin_data_part2 []byte\n\tvar auth_plugin_name []byte\n\tif capabilities&amp;0x00080000 &gt; 0 { \/\/CLIENT_PLUGIN_AUTH\n\t\tlength_of_plugin_auth_data := int(payload[offset])\n\t\toffset++\n\n\t\t\/\/ skips reserved 10bytes\n\t\toffset += 10\n\t\tif capabilities&amp;0x8000 &gt; 0 { \/\/CLIENT_SECURE_CONNECTION\n\t\t\tauth_plugin_data_part2 = payload[offset : offset+(length_of_plugin_auth_data-8)]\n\t\t\toffset += length_of_plugin_auth_data - 8\n\t\t\tfmt.Printf(\"    [auth_plugin_data_part2]: \\n\")\n\t\t\tfmt.Printf(\"    %s\", hex.Dump(auth_plugin_data_part2))\n\t\t}\n\n\t\tidx = bytes.IndexByte(payload[offset:], 0x00)\n\t\tauth_plugin_name = payload[offset : offset+idx]\n\t\tfmt.Printf(\"    [auth_plugin_name]: %s\\n\", auth_plugin_name)\n\t} else {\n\t\tpanic(\"not supported\")\n\t}\n\n\t\/\/ \u524d\u56de\u306e\u7bc4\u56f2\u306eINITIAL RESPONSE PACKET\n\t\/\/\n\t\/\/ \u3068\u308a\u3042\u3048\u305a\u5148\u306bscrambled password\u3092\u4f5c\u3063\u3066\u304a\u304f\n\t\/\/ SHA1( password ) XOR SHA1( challenge + SHA1( SHA1( password ) ) )\n\tauth_response := sha1_sum([]byte(password))\n\n\t\/\/ XOR\u7528\u306e\u30c7\u30fc\u30bf\u3092\u4f5c\u308b\n\tkey2 := sha1_sum(auth_response)\n\tchallenge := append(auth_plugin_data_part1, auth_plugin_data_part2[0:12]...)\n\n\t\/\/ SHA1(challenge + SHA1(SHA1(password)))\u306e\u90e8\u5206\n\tchallenge = append(challenge, key2...)\n\tchallenge_key := sha1_sum(challenge)\n\tfor i := 0; i &lt; 20; i++ {\n\t\t\/\/ XOR\u3057\u3066\u304f\n\t\tauth_response[i] ^= challenge_key[i]\n\t}\n\n\t\/\/ initial response packet\u306ebuffer size\u3092\u78ba\u4fdd\u3059\u308b\n\tbuffer_size := 4 + 4 + 4 + 1 + 23\n\tbuffer_size += len(username) + 1\n\tbuffer_size += 1\n\tbuffer_size += len(auth_response)\n\tbuffer_size += len(auth_plugin_name) + 1\n\tbuffer := make([]byte, buffer_size)\n\n\toffset = 0\n\t\/\/ header\u306b\u8a18\u8f09\u3059\u308b\u306e\u306fpayload\u306e\u30b5\u30a4\u30ba\u306a\u306e\u3067-4\u3057\u3068\u304f\n\tsize := buffer_size - 4\n\tbuffer[0] = byte(size)\n\tbuffer[1] = byte(size &gt;&gt; 8)\n\tbuffer[2] = byte(size &gt;&gt; 16)\n\t\/\/ initial response packet\u306finitial packet\u306e\u8fd4\u7b54\u306a\u306e\u3067sequence id\u30921\u306b\u3057\u3068\u304f\n\tbuffer[3] = 0x01\n\toffset = 4\n\n\t\/\/ \u5fc5\u8981\u306a\u30c7\u30fc\u30bf\u3092\u3069\u3093\u3069\u3093\u7a4d\u3093\u3067\u3044\u304f\n\tcapability_flags := uint32(CLIENT_PROTOCOL_41 |\n\t\tCLIENT_SECURE_CONNECTION | CLIENT_LONG_PASSWORD |\n\t\tCLIENT_TRANSACTIONS | CLIENT_LONG_FLAG)\n\tcharset = 0x21\n\tbuffer[offset] = byte(capability_flags)\n\tbuffer[offset+1] = byte(capability_flags &gt;&gt; 8)\n\tbuffer[offset+2] = byte(capability_flags &gt;&gt; 16)\n\tbuffer[offset+3] = byte(capability_flags &gt;&gt; 24)\n\toffset += 4\n\t\/\/ max packet size\u306f0\u3067\u3044\u3044\u306e\u3067skip\u3059\u308b\n\toffset += 4\n\tbuffer[offset] = byte(charset)\n\toffset += 1\n\t\/\/reserved 23 bytes\u6587\u3092skip\u3059\u308b\n\toffset += 23\n\n\t\/\/ username (null terminated string)\n\tcopy(buffer[offset:], username)\n\toffset += len(username) + 1\n\tbuffer[offset] = byte(len(auth_response))\n\toffset += 1\n\t\/\/ \u3055\u3063\u304d\u4f5c\u3063\u305fauth response\u306e\u30c7\u30fc\u30bf\u3092\u30b3\u30d4\u30fc\n\tcopy(buffer[offset:], auth_response)\n\toffset += len(auth_response)\n\t\/\/ \u6700\u5f8c\u306bauth plugin name\u3092\u30b3\u30d4\u30fc\u3057\u3066\u304a\u3057\u307e\u3044\n\tcopy(buffer[offset:], auth_plugin_name)\n\n\tfmt.Printf(\"\\n[write_packet:%d bytes]:\\n%s\", len(buffer), hex.Dump(buffer))\n\tconn.Write(buffer)\n\n\t\/\/ payload\u306e\u5148\u982d\u304c0x00\u306a\u3089\u8a8d\u8a3c\u6210\u529f\u306b\u306a\u308b\u3002\n\theader, payload = read_packet(conn)\n\tfmt.Printf(\"[header]:\\n%s\\n[payload]:\\n%s\\n\", hex.Dump(header), hex.Dump(payload))\n\n\t\/\/ \u4eca\u56de\u306e\u7bc4\u56f2\u3067\u3059\n\t\/\/\n\t\/\/ \u307b\u3044\u3058\u3083\u3001COM_QUERY\u306a\u3052\u307e\u3059\n\tq := com_query(\"select * from ex.ex1\")\n\tconn.Write(q)\n\n\theader, payload = read_packet(conn)\n\tfmt.Printf(\"[header]:\\n%s\\n[Column Count(Length Encoded Integer)]:\\n%s\", hex.Dump(header), hex.Dump(payload))\n\n\tcolumn_count, _, _ := read_lenenc_int(payload)\n\tfmt.Printf(\"Column Count: %d\\n\", column_count)\n\n\t\/\/ \u30ab\u30e9\u30e0\u5b9a\u7fa9\n\tfor {\n\t\theader, payload = read_packet(conn)\n\t\tif payload[0] == 0xfe {\n\t\t\t\/\/ EOF Packet\n\t\t\tbreak\n\t\t} else if payload[0] == 0x00 {\n\t\t\tpanic(\"Unsupported query result\")\n\t\t} else {\n\t\t\tfmt.Println()\n\t\t\toffset := 0\n\t\t\tcatalog, length, _ := read_lenenc_str(payload[offset:])\n\t\t\tfmt.Printf(\"Catalog: %s\\n\", catalog)\n\t\t\toffset += length\n\t\t\tschema, length, _ := read_lenenc_str(payload[offset:])\n\t\t\tfmt.Printf(\"Schema: %s\\n\", schema)\n\t\t\toffset += length\n\t\t\ttable, length, _ := read_lenenc_str(payload[offset:])\n\t\t\tfmt.Printf(\"Table: %s\\n\", table)\n\t\t\toffset += length\n\t\t\torg_table, length, _ := read_lenenc_str(payload[offset:])\n\t\t\tfmt.Printf(\"OrgTable: %s\\n\", org_table)\n\t\t\toffset += length\n\t\t\tname, length, _ := read_lenenc_str(payload[offset:])\n\t\t\tfmt.Printf(\"Name: %s\\n\", name)\n\t\t\toffset += length\n\t\t\torg_name, length, _ := read_lenenc_str(payload[offset:])\n\t\t\tfmt.Printf(\"OrgName: %s\\n\", org_name)\n\t\t\toffset += length\n\t\t\toffset += 1 \/\/ length of fixed length fields\n\t\t\tcharacter_set := binary.LittleEndian.Uint16(payload[offset : offset+2])\n\t\t\tfmt.Printf(\"CharacterSet: %d\\n\", character_set)\n\t\t\toffset += 2\n\t\t\tcolumn_length := binary.LittleEndian.Uint32(payload[offset : offset+4])\n\t\t\tfmt.Printf(\"ColumnLength: %d\\n\", column_length)\n\t\t\toffset += 4\n\t\t\tcolumn_type := uint8(payload[offset])\n\t\t\tfmt.Printf(\"ColumnType: %d\\n\", column_type)\n\t\t\toffset += 1\n\t\t\tflags := binary.LittleEndian.Uint16(payload[offset : offset+2])\n\t\t\tfmt.Printf(\"Flags: %d\\n\", flags)\n\t\t\toffset += 2\n\t\t\tdecimals := uint8(payload[offset])\n\t\t\tfmt.Printf(\"Decimals: %d\\n\", decimals)\n\t\t\toffset += 1\n\t\t}\n\t}\n\n\t\/\/ \u7d50\u679c\u30bb\u30c3\u30c8\n\tfmt.Println()\n\tfor {\n\t\theader, payload = read_packet(conn)\n\t\tif payload[0] == 0xfe {\n\t\t\t\/\/ EOF Packet\n\t\t\tbreak\n\t\t} else {\n\t\t\toffset := 0\n\t\t\tfmt.Println()\n\t\t\tfor i := 0; i &lt; int(column_count); i++ {\n\t\t\t\tvalue, length, _ := read_lenenc_str(payload[offset:])\n\t\t\t\toffset += length\n\t\t\t\tfmt.Printf(\"Value: %s\\n\", value)\n\t\t\t}\n\t\t}\n\t}\n}<\/pre>\n<p><\/p>\n<p>\u3061\u3087\u3063\u3068\u96d1\u3067\u3059\u304cSelect Query\u306e\u5b9f\u884c\u304b\u3089\u7d50\u679c\u30bb\u30c3\u30c8\u306e\u53d6\u5f97\u307e\u3067\u3072\u3068\u901a\u308a\u51fa\u6765\u307e\u3057\u305f\u306d\uff01<br \/>\n<\/p>\n<h3 id=\"hs_609eb923d7b0f09c3ae6889a5545027e_header_8\"> \u6b21\u56de\u306b\u5411\u3051\u3066<\/h3>\n<p>\u3053\u306e\u4e09\u56de\u306e\u9023\u8f09\u3067MySQL\u30d7\u30ed\u30c8\u30b3\u30eb\u306e\u57fa\u790e\u7684\u306a\u90e8\u5206\u306f\u7d42\u308f\u3063\u305f\u306e\u3067\u3042\u3068\u306f\u8208\u5473\u304c\u3042\u308c\u3070\u81ea\u5206\u3067\u5b9f\u88c5\u304c\u3067\u304d\u308b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>MySQL\u30d7\u30ed\u30c8\u30b3\u30eb\u3092\u7406\u89e3\u3057\u3066\u3044\u308c\u3070MySQL\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u7684\u306a\u632f\u308b\u821e\u3044\u304c\u60f3\u50cf\u3057\u3084\u3059\u304f\u306a\u308a\u307e\u3059\u3057\u3001\u8272\u3005\u306ahack\u3082\u3067\u304d\u308b\u306e\u3067\u98df\u308f\u305a\u5acc\u3044\u305b\u305a\u306b\u662f\u975e\u4e00\u5ea6\u8a66\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u6b21\u56de\u306eMySQL\u30d7\u30ed\u30c8\u30b3\u30eb\u5165\u9580\u306e\u8a18\u4e8b\u3067\u306f\u30d7\u30ed\u30c8\u30b3\u30eb\u304b\u3089\u4e00\u65e6\u96e2\u308cBinlog Format\u306e\u89e3\u8aac\u306b\u5165\u308a\u307e\u3059\u3002<br \/>\n\u305d\u308c\u3067\u306f Happy Hacking<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u307f\u306a\u3055\u3093\u9023\u4f11\u306f\u3069\u3046\u3067\u3057\u305f\u304b\uff1f\u79c1\u306f\u3068\u3044\u3046\u3082\u306e\u305a\u30fc\u3063\u3068\u5bb6\u306b\u5f15\u304d\u3053\u3082\u3063\u3066cloudbit\u3067ssh\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u305f\u308a\u3057\u3066\u904a\u3093\u3067\u3044\u307e\u3057\u305f\u3002 \u4eca\u65e5\u306e\u8a18\u4e8b\u3067\u306fMySQL Server\u306b\u5bfe\u3057\u3066\u30b3\u30de\u30f3\u30c9\u3092\u767a\u884c\u3057\u3066\u7d50\u679c\u3092\u53d6\u5f97\u3057\u3066\u3044\u304d [&hellip;]<\/p>\n","protected":false},"author":100,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[],"tags":[80,17],"class_list":["post-11487","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-golang","tag-mysql"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/11487","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/users\/100"}],"replies":[{"embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/comments?post=11487"}],"version-history":[{"count":3,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/11487\/revisions"}],"predecessor-version":[{"id":11505,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/11487\/revisions\/11505"}],"wp:attachment":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/media?parent=11487"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/categories?post=11487"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/tags?post=11487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}