Документация на MySQL

Протокол клиент/сервер


На всякий случай приведу подробное описание протокола "клиент-сервер", используемого пакетом 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 более подробную информацию о форматах пакетов.



Содержание раздела