diff --git a/ext/mysqlnd/mysqlnd_charset.h b/ext/mysqlnd/mysqlnd_charset.h index d7f8053dd8606..a2b1e2f148316 100644 --- a/ext/mysqlnd/mysqlnd_charset.h +++ b/ext/mysqlnd/mysqlnd_charset.h @@ -19,6 +19,9 @@ #ifndef MYSQLND_CHARSET_H #define MYSQLND_CHARSET_H +#define MYSQLND_UTF8_MB3_DEFAULT_ID 33 +#define MYSQLND_UTF8_MB4_DEFAULT_ID 45 + PHPAPI zend_ulong mysqlnd_cset_escape_quotes(const MYSQLND_CHARSET * const charset, char * newstr, const char * escapestr, const size_t escapestr_len); diff --git a/ext/mysqlnd/mysqlnd_commands.c b/ext/mysqlnd/mysqlnd_commands.c index ae64560850531..a02665976851b 100644 --- a/ext/mysqlnd/mysqlnd_commands.c +++ b/ext/mysqlnd/mysqlnd_commands.c @@ -22,6 +22,7 @@ #include "mysqlnd_auth.h" #include "mysqlnd_wireprotocol.h" #include "mysqlnd_debug.h" +#include "mysqlnd_charset.h" /* {{{ mysqlnd_command::set_option */ @@ -642,13 +643,12 @@ MYSQLND_METHOD(mysqlnd_command, handshake)(MYSQLND_CONN_DATA * const conn, const conn->protocol_version = greet_packet.protocol_version; conn->server_version = mnd_pestrdup(greet_packet.server_version, conn->persistent); - conn->greet_charset = mysqlnd_find_charset_nr(greet_packet.charset_no); - if (!conn->greet_charset) { - char * msg; - mnd_sprintf(&msg, 0, "Server sent charset (%d) unknown to the client. Please, report to the developers", greet_packet.charset_no); - SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, msg); - mnd_sprintf_free(msg); - goto err; + const MYSQLND_CHARSET *read_charset = mysqlnd_find_charset_nr(greet_packet.charset_no); + if (!read_charset) { + greet_packet.charset_no = conn->m->get_server_version(conn) >= 50500 ? MYSQLND_UTF8_MB4_DEFAULT_ID : MYSQLND_UTF8_MB3_DEFAULT_ID; + conn->greet_charset = mysqlnd_find_charset_nr(greet_packet.charset_no); + } else { + conn->greet_charset = read_charset; } conn->server_capabilities = greet_packet.server_capabilities;