Протокол клиент/сервер
На всякий случай приведу подробное описание протокола "клиент-сервер", используемого пакетом MySQL для связи между клиентом и сервером базы данных.
Обозначения
< = клиент > = сервер [] 1 байт [2: ] 2 байта (нижний байт первый) [3: ] 3 байта (нижний байт первый) [4: ] 4 байта (нижний байт первый) [string: ] строка, кончающаяся нулем. [length: ] длина целого числа. Проверьте Net_store_length() для этого! Идея в том, чтобы наиболее часто получать данные длиной в 1 байт, но допускать и более длинные данные (и NULL).
Детальное описание
Каждый передаваемый пакет имеет следующий префикс:
[3: длина пакета] [номер пакета] данные
При приеме пакета добавляется [0] после каждого принятого пакета, чтобы получить простую обработку строк ошибки.
Номера пакетов начинаются с 0 и увеличиваются для каждого посланного/полученного пакета.
Типы пакетов
:connect
> [protocol version] [string: password crypt seed] < [2: 0] [3: max_allowed_client_packet_length] [string: user name] [string: scrambled password] > ok packet
Посмотрите в файле password.c из исходников MySQL какой метод используется для шифрования паролей. Пароль должен быть пустым, если пользователь не имеет никакого пароля.
:ok
[0] [length: affected_rows] [length: unique id]
:error
Может приходить в любое время.
> [255] [string: error message]
:command
< [command number]
enum enum_server_command{SLEEP,QUIT,INIT_DB,QUERY,FIELD_LIST, CREATE_DB,DROP_DB,RELOAD,SHUTDOWN,STATISTICS, PROCESS_INFO,CONNECT}
:query
< [QUERY command] [string: query string] (The end null is not sent) > [0] [length: affected rows] [length: insert id] (Insert, delete...)
или:
> [length: column_count] (a query result) > column field data packets > row data packets
:data
: Данные передаются пока не придет пакет, который состоит только из одиночного символа [254]. Остерегайтесь: могут иметься пакеты, которые начинаются с символа 254! Каждый пакет типа 'data' имеет поле 'column count'.
Формат каждого поля:
[:length] == NULL_LENGTH -> NULL field
или:
[:length] [length data] (Строка не оканчивается на \0!)
Пакет данных столбца состоит из 5 столбцов со следующими данными:
[:string table name] [:string column name] [:3 create length of column (may be larger in a few cases)] [:1 type (as of enum_field_types)] [:1 flag] [:1 decimals] (2 байта!)
При использовании команды list_fields имеется шестой столбец:
[:string default]
Посмотрите в файлах libmysql.c, net.c и password.c более подробную информацию о форматах пакетов.