This document descibes the MySQL network protocol version 10, as of October 2002 (MySQL 3.23.52). It has been produced by reading libmysql.c, net.c and sql_show.cc in the MySQL source.
The protocol requires first that a client and server negotiate a connection, including agreeing about protocol features and authentication. This is followed by a series of requests from the client and reponses from the server, until either the client issues a QUIT request or the connection is broken.
MySQL uses either a Unix domain socket (usually /tmp/mysql.sock or /var/run/mysqld/mysql.sock), an MS Windows named pipe (usually \\hostname\pipe\mysql) or a TCP port (usually 3306). It treats all communications methods identically.
Each client message is sent as a single MySQL 'packet'; a server response may consist of many packets. These packets are not related to the underlying network layer packets, and indeed many response packets may be contained in a single IP datagram.
Each packet begins with a 4-byte header. The first three header bytes give the body length as a Little-Endian integer (all MySQL integers are Little-Endian unless described otherwise). The fourth gives a packet number for this transaction, starting from 0, and including both client and server messages. The body of the message then follows.
All example packets are taken from a real system.
Once the transport-level connection is established, the connection negotiation starts with the server identifying itself.
The host sends an initial greeting similar to:
| 2c 00 00 00 | Body Length=44, packet=0 |
| 0a | Protocol=10 |
| 33 2e 32 33 2e 35 32 2d 6c 6f 67 00 | Version="3.23.52-log" |
| 04 00 00 00 | Thread ID=4 |
| 79 46 2f 57 48 43 57 6a 00 | Salt="yF/WHCWj" |
| 2c 20 | Caps=LONG_FLAG | CONNECT_WITH_DB | COMPRESS | TRANSACTIONS |
| 08 | Charset=Latin-1 |
| 02 00 | Status=AUTOCOMMIT |
| 00 00 00 00 00 00 00 00 00 00 00 00 00 | 13 bytes unused |
The first byte of the message body is the protocol version, currently 10; the current client is capable of connecting to protocol 9 or 10 servers. The protocol version is followed by a version string for the server (here 3.23.52-log), null-terminated - the -log suffix means logging is enabled. Following this is a 4-byte integer describing the thread ID of the server thread handling the request. Finally an 8-byte 'scramble string' salt for encryption, again null-terminated.
Newer servers follow this by a 2-byte integer describing the server's capabilities - this server can do LONG_FLAG and CONNECT_WITH_DB, as well as the more recent COMPRESS and TRANSACTIONS. Even newer servers follow this with a single byte giving the server character set and two bytes describing the server status.
The client now sends a request to the server, similar to:
| 12 00 00 01 | Body Length=18, packet=1 |
| 85 24 | Caps=LONG_PASSWORD | LONG_FLAG | TRANSACTIONS | INTERACTIVE | LOCAL_FILES |
| 00 00 00 | Max packet=16777216 |
| 72 6f 6f 74 00 | User="root" |
| 5b 43 4f 54 52 46 47 59 | Password="[COTRFGY" |
This is the client's turn to send its capabilities in two bytes. These will always include LONG_PASSWORD, LONG_FLAG and TRANSACTIONS for modern clients, and in this case include INTERACTIVE and LOCAL_FILES as well, as this is the standard MySQL command-line client.
At this point the client will switch to SSL on the communications channel if it has set the SSL capability bit - which it will not do if the server has not also set that bit.
This is followed by three bytes giving the maximum allowed packet length. A value of 0 here means 2^24=16MB, and will be used by modern clients. This is followed by the username, null-terminated, and the eight characters of scrambled password (the example given here is not a real password) if a password is provided.
If the client is trying to connect to a particular database and the server is capable of CONNECT_WITH_DB, it will add the database name as a null-terminated string.
The client will now expect the server to send an OK simple response or an error. After an OK response, the flow of client commands can begin; after an error response the client closes the connection.
If the client and server are both capable of compression, and the client wants to use it (it usually has to be explicitly enabled), the client will now switch to using it. It follows the standard packet header with a three-byte compressed length. The compression mechanism used is standard zlib.
Most commands produce a simple 'OK' response. This will usually be of the form:
| 05 00 00 01 | Body Length=5, packet=1 |
| 00 00 00 02 00 | OK |
In the case of an OK response to the initial authentication, of course, the packet number will be 2.
For an error, the response will be more like the following:
| 27 00 00 01 | Body Length=39, packet=1 |
| ff | Error |
| 7a 04 | Error code=NO_SUCH_TABLE (1146) |
| 54 61 62 6c 65 20 27 72 65 64 66 65 72 6e 69 2e 73 61 6d 70 6c 65 27 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 | Error meesage="Table 'redferni.sample' doesn't exist" |
The first byte of the error response body is set to 255.
If the body length is at least 4, then the packet contains a 2-byte error code, followed by the error message, of up to 200 characters. The error code is absent in protocol 9 servers.
There are 218 error codes, ranging from HASHCHK (1000) to ROW_IS_REFERENCED (1217).
A simple command is sent in the form:
| 0f 00 00 00 | Body Length=15, packet=0 |
| 03 | Command=QUERY |
| 73 68 6f 77 20 64 61 74 61 62 61 73 65 73 | Arg="show databases" |
The first byte is the command code, followed by an optional argument. Any command not explicitly listed, including any SQL command, is sent as QUERY, as in the example.
When the client wishes to disconnect, it sends a QUIT simple
command and closes its end of the connection, as follows
| 01 00 00 00 | Body Length=1, packet=0 |
| 01 | Command=QUIT |
The server will close its end of the connection without further response.
When data is sent in tabular form, each field is preceded by its field length, encoded in the following manner:
| Byte | Meaning |
|---|---|
| 0-250 | Same as byte |
| 251 | NULL field |
| 252 | Value in following 2 bytes |
| 253 | Value in following 3 bytes |
| 254 | Value in following 8 bytes |
This mechanism is also used for encoding other integers efficiently.
When returning data as a table, as a response to a QUERY, FIELD_LIST or PROCESS_INFO command, MySQL first describes the fields in each row, then sends the rows.
| 16 00 00 02 | Body Length=22, packet=2 |
| 06 73 65 6d 70 6c 65 | Table="sample" |
| 04 6e 61 6d 65 | Field="name" |
| 03 14 00 00 | Length=20 |
| 01 fd | Type=VAR_STRING |
| 03 00 00 00 | Flags=0000, Decimals=00 |
There is one logical packet per field description. Each field description contains five parts, each preceded by their length in field_length encoding: the table name, the field name, the maximum length (a 3 byte integer), the field type and 2 bytes of flags followed by one byte of decimals.
In a client or server without the LONG_FLAG capability, there is only one byte of field flags.
If default values are provided (this will usually just be for the FIELD_LIST command), there is a sixth part to the field description: default value.
| 01 00 00 04 | Body Length=1, packet=4 |
| fe | End of field list |
After all the field description packets, a packet with just a single byte of value 254 indicates the start of the rows.
| 09 00 00 05 | Body Length=9, packet=5 |
| 06 41 73 68 6c 65 79 | Row 1 Col 1="Ashley" |
| 01 31 | Row 1 Col 2=1 |
Each row is in a separate packet, with the field values preceded by a field length. All non-binary fields values are sent as text - in particular, all numeric fields appear as ASCII, and timestamps as YYYY-MM-DD HH:MM:SS. Trailing spaces are removed from char and varchar fields.
| 01 00 00 07 | Body Length=1, packet=7 |
| fe | End of row list |
After the last row, another packet holding just the byte 254 indicates the end of the data.
There are four commands that can return complex responses.
The STATISTICS command response is simply a string describing the current server statistics.
The FIELD_LIST command response is the same as the first part of a tabular response (the field descriptions) - with the exception that a default value may be attached to each field description.
The PROCESS_INFO command response is first a packet containing a field count, in field_length encoding, followed by a tabular response.
The QUERY command handles all SQL commands, as well as almost all client commands.
There are three forms of response. The simplest is where no tabular data needs to be returned:
| 05 00 00 01 | Body Length=5, packet=1 |
| 00 | 0=OK - no tabular data |
| 00 | Affected rows=0 |
| 00 | Insert id=0 |
| 02 00 | Status=AUTOCOMMIT |
Here, the first byte is 0 and the following two entries are field_length encoded. If the server is capable of transactions, two bytes of server status will follow.
Finally, some additional information may be provided as a string, preceded by its field length.
If a file is to be sent to the server, the following response is generated:
| 01 00 00 01 | Body Length=1, packet=1 |
| fb | 251=Upload file |
The file is sent by the client as a series of ordinary packets, with the final packet empty.
Otherwise, the result contains a field count, followed by some extra information (possibly a row count), both field_length encoded:
| 01 00 00 01 | Body Length=1, packet=1 |
| 02 | Field count=2 |
This is then followed by the tabular data.
Many MySQL clients and drivers expect certain behaviour from the server, and perform queries behind the scenes. The important responses are shown below.
The mysql command-line client issues the request
select DATABASE(),USER()
when the user asks for the current status. It will expect the
following response:
| DATABASE() | USER() |
| VARCHAR(34) NOT NULL | VARCHAR(77) NOT NULL |
The DATABASE() field may be empty. The USER() field is of the form user@host.
The current status response is similar to:
Uptime: 129 Threads: 1 Questions: 6 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 0 Queries per second avg: 0.047
The mysql client assumes the number following the first space is a time and formats it appropriately.
| Variable_name | Value |
| CHAR(30) NOT NULL | CHAR(256) NOT NULL |
| Database |
| CHAR(64) NOT NULL |
| Tables_in_db |
| CHAR(64) NOT NULL |
| Field | Type | Null | Key | Default | Extra |
| CHAR(64) NOT NULL | CHAR(40) NOT NULL | CHAR(1) NOT NULL | CHAR(3) NOT NULL | CHAR(64) | CHAR(20) NOT NULL |
The Null field takes values '' or 'YES' - this is presumably a bug. The Key field is 'PRI', 'UNI', 'MUL'or ''.
The same output is produce by show columns, desc or describe.
| Id | User | Host | db | Command | Time | State | Info |
| Int | CHAR(16) NOT NULL | CHAR(64) NOT NULL | CHAR(64) | CHAR(16) NOT NULL | CHAR(7) NOT NULL | CHAR(30) | CHAR(100) |
Show processlist full removes the size limit on the Info column.
The protocol 9 and protocol 10 password algorithms are different. In both cases, a seed is provided by the server and a password is provided by the user, and together they are used to generate a scrambled message of the same length as the seed.
A string is hashed to a pair of unsigned longs using the following algorithm:
| n1 = 1345345333 n2 = 305419889 add = 7 foreach c in password (ignoring space or tab) | |
|
n1 = n1 EOR
(((n1 & 63) + add) * c +
n1 * 256) n2 = (n2 * 256) EOR n1 add = add + c | |
Only the bottom 31 bits of the unsigned longs are used.
First the password, then the salt are hashed to give two pairs of longs: p1, p2, s1 and s2. These are then used to generate the two seeds of a random number generator, which takes values between 0 and 230-2.
seed1 = p1 EOR
s1
seed2 = p2 EOR
s2
The random number generator algorithm is:
seed1 = (seed1 * 3 +
seed2) mod 230 - 1
seed2 = (seed1 +
seed2 + 33) mod 230 - 1
return seed1 / (230 - 1)
The random number generator is called once for each byte of the salt, and the number given is multiplied by 31 and added to 64 to give an ASCII character between '@' and '^'.
msg[i] = chr(64 + rng()*31)
The string just given then has each character exclusive-ored with the random number generator multiplied by 31.
msg[i] = msg[i] eor(rng()*31)
Here only p1 and s1 are used, 230 is replaced by 229 and seed2 is initially set to seed1 / 2. The final exclusive-or pass to modify the message is also skipped.
MySQL uses the following codes:
| Capability name | Value | Meaning |
|---|---|---|
| LONG_PASSWORD | 1 | New more secure passwords |
| FOUND_ROWS | 2 | Found instead of affected rows |
| LONG_FLAG | 4 | Get all column flags |
| CONNECT_WITH_DB | 8 | One can specify db on connect |
| NO_SCHEMA | 16 | Don't allow database.table.column |
| COMPRESS | 32 | Can use compression protocol |
| ODBC | 64 | ODBC client |
| LOCAL_FILES | 128 | Can use LOAD DATA LOCAL |
| IGNORE_SPACE | 256 | Ignore spaces before '(' |
| CHANGE_USER | 512 | Support the mysql_change_user() |
| INTERACTIVE | 1024 | This is an interactive client |
| SSL | 2048 | Switch to SSL after handshake |
| IGNORE_SIGPIPE | 4096 | IGNORE sigpipes |
| TRANSACTIONS | 8192 | Client knows about transactions |
| Command | Code | Arguments | Allowed from client |
|---|---|---|---|
| SLEEP | 0 | No | |
| QUIT | 1 | "" | |
| INIT_DB | 2 | db | |
| QUERY | 3 | query | |
| FIELD_LIST | 4 | table | |
| CREATE_DB | 5 | db | |
| DROP_DB | 6 | db | |
| REFRESH | 7 | option bits | |
| SHUTDOWN | 8 | ||
| STATISTICS | 9 | ||
| PROCESS_INFO | 10 | ||
| CONNECT | 11 | No | |
| PROCESS_KILL | 12 | 4-byte pid | |
| DEBUG | 13 | ||
| PING | 14 | ||
| TIME | 15 | No | |
| DELAYED_INSERT | 16 | No | |
| CHANGE_USER | 17 | user | |
| BINLOG_DUMP | 18 | ||
| TABLE_DUMP | 19 | ||
| CONNECT_OUT | 20 | No |
| Type | Code | Type | Code |
|---|---|---|---|
| DECIMAL | 0 | ENUM | 247 |
| TINY | 1 | SET | 248 |
| SHORT | 2 | TINY_BLOB | 249 |
| LONG | 3 | MEDIUM_BLOB | 250 |
| FLOAT | 4 | LONG_BLOB | 251 |
| DOUBLE | 5 | BLOB | 252 |
| NULL | 6 | VAR_STRING | 253 |
| TIMESTAMP | 7 | STRING | 254 |
| LONGLONG | 8 | ||
| INT24 | 9 | ||
| DATE | 10 | ||
| TIME | 11 | ||
| DATETIME | 12 | ||
| YEAR | 13 | ||
| NEWDATE | 14 |
| Status | Code |
|---|---|
| IN_TRANS | 1 |
| AUTOCOMMIT | 2 |
| Charset | Code | Charset | Code |
|---|---|---|---|
| big5 | 1 | hebrew | 16 |
| czech | 2 | win1251 | 17 |
| dec8 | 3 | tis620 | 18 |
| dos | 4 | euc_kr | 19 |
| german1 | 5 | estonia | 20 |
| hp8 | 6 | hungarian | 21 |
| koi8_ru | 7 | koi8_ukr | 22 |
| latin1 | 8 | win1251ukr | 23 |
| latin2 | 9 | gb2312 | 24 |
| swe7 | 10 | greek | 25 |
| usa7 | 11 | win1250 | 26 |
| ujis | 12 | croat | 27 |
| sjis | 13 | gbk | 28 |
| cp1251 | 14 | cp1257 | 29 |
| danish | 15 | latin5 | 30 |
| Field Flag | Value | Meaning |
|---|---|---|
| NOT_NULL | 1 | Field can't be NULL |
| PRI_KEY | 2 | Field is part of a primary key |
| UNIQUE_KEY | 4 | Field is part of a unique key |
| MULTIPLE_KEY | 8 | Field is part of a key |
| BLOB | 16 | Field is a blob |
| UNSIGNED | 32 | Field is unsigned |
| ZEROFILL | 64 | Field is zerofill |
| BINARY | 128 | Field is binary |
| ENUM | 256 | Field is an enum |
| AUTO_INCREMENT | 512 | Field is an autoincrement field |
| TIMESTAMP | 1024 | Field is a timestamp |
| SET | 2048 | Field is a set |
| NUM | 32768 | Field is num (for clients) |
Note that the NUM flag is set automatically by the client, based on the field type.
| Error | Value | Error | Value |
|---|---|---|---|
| HASHCHK | 1000 | WRONG_PARAMETERS_TO_PROCEDURE | 1108 |
| NISAMCHK | 1001 | UNKNOWN_TABLE | 1109 |
| NO | 1002 | FIELD_SPECIFIED_TWICE | 1110 |
| YES | 1003 | INVALID_GROUP_FUNC_USE | 1111 |
| CANT_CREATE_FILE | 1004 | UNSUPPORTED_EXTENSION | 1112 |
| CANT_CREATE_TABLE | 1005 | TABLE_MUST_HAVE_COLUMNS | 1113 |
| CANT_CREATE_DB | 1006 | RECORD_FILE_FULL | 1114 |
| DB_CREATE_EXISTS | 1007 | UNKNOWN_CHARACTER_SET | 1115 |
| DB_DROP_EXISTS | 1008 | TOO_MANY_TABLES | 1116 |
| DB_DROP_DELETE | 1009 | TOO_MANY_FIELDS | 1117 |
| DB_DROP_RMDIR | 1010 | TOO_BIG_ROWSIZE | 1118 |
| CANT_DELETE_FILE | 1011 | STACK_OVERRUN | 1119 |
| CANT_FIND_SYSTEM_REC | 1012 | WRONG_OUTER_JOIN | 1120 |
| CANT_GET_STAT | 1013 | NULL_COLUMN_IN_INDEX | 1121 |
| CANT_GET_WD | 1014 | CANT_FIND_UDF | 1122 |
| CANT_LOCK | 1015 | CANT_INITIALIZE_UDF | 1123 |
| CANT_OPEN_FILE | 1016 | UDF_NO_PATHS | 1124 |
| FILE_NOT_FOUND | 1017 | UDF_EXISTS | 1125 |
| CANT_READ_DIR | 1018 | CANT_OPEN_LIBRARY | 1126 |
| CANT_SET_WD | 1019 | CANT_FIND_DL_ENTRY | 1127 |
| CHECKREAD | 1020 | FUNCTION_NOT_DEFINED | 1128 |
| DISK_FULL | 1021 | HOST_IS_BLOCKED | 1129 |
| DUP_KEY | 1022 | HOST_NOT_PRIVILEGED | 1130 |
| ERROR_ON_CLOSE | 1023 | PASSWORD_ANONYMOUS_USER | 1131 |
| ERROR_ON_READ | 1024 | PASSWORD_NOT_ALLOWED | 1132 |
| ERROR_ON_RENAME | 1025 | PASSWORD_NO_MATCH | 1133 |
| ERROR_ON_WRITE | 1026 | UPDATE_INFO | 1134 |
| FILE_USED | 1027 | CANT_CREATE_THREAD | 1135 |
| FILSORT_ABORT | 1028 | WRONG_VALUE_COUNT_ON_ROW | 1136 |
| FORM_NOT_FOUND | 1029 | CANT_REOPEN_TABLE | 1137 |
| GET_ERRNO | 1030 | INVALID_USE_OF_NULL | 1138 |
| ILLEGAL_HA | 1031 | REGEXP_ERROR | 1139 |
| KEY_NOT_FOUND | 1032 | MIX_OF_GROUP_FUNC_AND_FIELDS | 1140 |
| NOT_FORM_FILE | 1033 | NONEXISTING_GRANT | 1141 |
| NOT_KEYFILE | 1034 | TABLEACCESS_DENIED_ERROR | 1142 |
| OLD_KEYFILE | 1035 | COLUMNACCESS_DENIED_ERROR | 1143 |
| OPEN_AS_READONLY | 1036 | ILLEGAL_GRANT_FOR_TABLE | 1144 |
| OUTOFMEMORY | 1037 | GRANT_WRONG_HOST_OR_USER | 1145 |
| OUT_OF_SORTMEMORY | 1038 | NO_SUCH_TABLE | 1146 |
| UNEXPECTED_EOF | 1039 | NONEXISTING_TABLE_GRANT | 1147 |
| CON_COUNT_ERROR | 1040 | NOT_ALLOWED_COMMAND | 1148 |
| OUT_OF_RESOURCES | 1041 | SYNTAX_ERROR | 1149 |
| BAD_HOST_ERROR | 1042 | DELAYED_CANT_CHANGE_LOCK | 1150 |
| HANDSHAKE_ERROR | 1043 | TOO_MANY_DELAYED_THREADS | 1151 |
| DBACCESS_DENIED_ERROR | 1044 | ABORTING_CONNECTION | 1152 |
| ACCESS_DENIED_ERROR | 1045 | NET_PACKET_TOO_LARGE | 1153 |
| NO_DB_ERROR | 1046 | NET_READ_ERROR_FROM_PIPE | 1154 |
| UNKNOWN_COM_ERROR | 1047 | NET_FCNTL_ERROR | 1155 |
| BAD_NULL_ERROR | 1048 | NET_PACKETS_OUT_OF_ORDER | 1156 |
| BAD_DB_ERROR | 1049 | NET_UNCOMPRESS_ERROR | 1157 |
| TABLE_EXISTS_ERROR | 1050 | NET_READ_ERROR | 1158 |
| BAD_TABLE_ERROR | 1051 | NET_READ_INTERRUPTED | 1159 |
| NON_UNIQ_ERROR | 1052 | NET_ERROR_ON_WRITE | 1160 |
| SERVER_SHUTDOWN | 1053 | NET_WRITE_INTERRUPTED | 1161 |
| BAD_FIELD_ERROR | 1054 | TOO_LONG_STRING | 1162 |
| WRONG_FIELD_WITH_GROUP | 1055 | TABLE_CANT_HANDLE_BLOB | 1163 |
| WRONG_GROUP_FIELD | 1056 | TABLE_CANT_HANDLE_AUTO_INCREMENT | 1164 |
| WRONG_SUM_SELECT | 1057 | DELAYED_INSERT_TABLE_LOCKED | 1165 |
| WRONG_VALUE_COUNT | 1058 | WRONG_COLUMN_NAME | 1166 |
| TOO_LONG_IDENT | 1059 | WRONG_KEY_COLUMN | 1167 |
| DUP_FIELDNAME | 1060 | WRONG_MRG_TABLE | 1168 |
| DUP_KEYNAME | 1061 | DUP_UNIQUE | 1169 |
| DUP_ENTRY | 1062 | BLOB_KEY_WITHOUT_LENGTH | 1170 |
| WRONG_FIELD_SPEC | 1063 | PRIMARY_CANT_HAVE_NULL | 1171 |
| PARSE_ERROR | 1064 | TOO_MANY_ROWS | 1172 |
| EMPTY_QUERY | 1065 | REQUIRES_PRIMARY_KEY | 1173 |
| NONUNIQ_TABLE | 1066 | NO_RAID_COMPILED | 1174 |
| INVALID_DEFAULT | 1067 | UPDATE_WITHOUT_KEY_IN_SAFE_MODE | 1175 |
| MULTIPLE_PRI_KEY | 1068 | KEY_DOES_NOT_EXITS | 1176 |
| TOO_MANY_KEYS | 1069 | CHECK_NO_SUCH_TABLE | 1177 |
| TOO_MANY_KEY_PARTS | 1070 | CHECK_NOT_IMPLEMENTED | 1178 |
| TOO_LONG_KEY | 1071 | CANT_DO_THIS_DURING_AN_TRANSACTION | 1179 |
| KEY_COLUMN_DOES_NOT_EXITS | 1072 | ERROR_DURING_COMMIT | 1180 |
| BLOB_USED_AS_KEY | 1073 | ERROR_DURING_ROLLBACK | 1181 |
| TOO_BIG_FIELDLENGTH | 1074 | ERROR_DURING_FLUSH_LOGS | 1182 |
| WRONG_AUTO_KEY | 1075 | ERROR_DURING_CHECKPOINT | 1183 |
| READY | 1076 | NEW_ABORTING_CONNECTION | 1184 |
| NORMAL_SHUTDOWN | 1077 | DUMP_NOT_IMPLEMENTED | 1185 |
| GOT_SIGNAL | 1078 | FLUSH_MASTER_BINLOG_CLOSED | 1186 |
| SHUTDOWN_COMPLETE | 1079 | INDEX_REBUILD | 1187 |
| FORCING_CLOSE | 1080 | MASTER | 1188 |
| IPSOCK_ERROR | 1081 | MASTER_NET_READ | 1189 |
| NO_SUCH_INDEX | 1082 | MASTER_NET_WRITE | 1190 |
| WRONG_FIELD_TERMINATORS | 1083 | FT_MATCHING_KEY_NOT_FOUND | 1191 |
| BLOBS_AND_NO_TERMINATED | 1084 | LOCK_OR_ACTIVE_TRANSACTION | 1192 |
| TEXTFILE_NOT_READABLE | 1085 | UNKNOWN_SYSTEM_VARIABLE | 1193 |
| FILE_EXISTS_ERROR | 1086 | CRASHED_ON_USAGE | 1194 |
| LOAD_INFO | 1087 | CRASHED_ON_REPAIR | 1195 |
| ALTER_INFO | 1088 | WARNING_NOT_COMPLETE_ROLLBACK | 1196 |
| WRONG_SUB_KEY | 1089 | TRANS_CACHE_FULL | 1197 |
| CANT_REMOVE_ALL_FIELDS | 1090 | SLAVE_MUST_STOP | 1198 |
| CANT_DROP_FIELD_OR_KEY | 1091 | SLAVE_NOT_RUNNING | 1199 |
| INSERT_INFO | 1092 | BAD_SLAVE | 1200 |
| INSERT_TABLE_USED | 1093 | MASTER_INFO | 1201 |
| NO_SUCH_THREAD | 1094 | SLAVE_THREAD | 1202 |
| KILL_DENIED_ERROR | 1095 | TOO_MANY_USER_CONNECTIONS | 1203 |
| NO_TABLES_USED | 1096 | SET_CONSTANTS_ONLY | 1204 |
| TOO_BIG_SET | 1097 | LOCK_WAIT_TIMEOUT | 1205 |
| NO_UNIQUE_LOGFILE | 1098 | LOCK_TABLE_FULL | 1206 |
| TABLE_NOT_LOCKED_FOR_WRITE | 1099 | READ_ONLY_TRANSACTION | 1207 |
| TABLE_NOT_LOCKED | 1100 | DROP_DB_WITH_READ_LOCK | 1208 |
| BLOB_CANT_HAVE_DEFAULT | 1101 | CREATE_DB_WITH_READ_LOCK | 1209 |
| WRONG_DB_NAME | 1102 | WRONG_ARGUMENTS | 1210 |
| WRONG_TABLE_NAME | 1103 | NO_PERMISSION_TO_CREATE_USER | 1211 |
| TOO_BIG_SELECT | 1104 | UNION_TABLES_IN_DIFFERENT_DIR | 1212 |
| UNKNOWN_ERROR | 1105 | LOCK_DEADLOCK | 1213 |
| UNKNOWN_PROCEDURE | 1106 | TABLE_CANT_HANDLE_FULLTEXT | 1214 |
| WRONG_PARAMCOUNT_TO_PROCEDURE | 1107 | CANNOT_ADD_FOREIGN | 1215 |
This document is in the public domain, and you may do anything with it you wish. The author takes no responsibility for the accuracy of its contents. Some of the terms in this document are trademarks of MySQL AB and other companies. No trade secrets or other privileged information has been used in its compilation, and the author has no relationship with MySQL.