#ifdef PDO_MYSQL_HAS_CHARSET
if (vars[0].optval && mysql_options(H->server, MYSQL_SET_CHARSET_NAME, vars[0].optval)) {
pdo_mysql_error(dbh);
goto cleanup;
}
#endif
mysqlnd_libmysql_compat.h:#define mysql_options(r,a,b) mysqlnd_options((r), (a), (b))
mysqlnd.h:#define mysqlnd_options(conn, opt, value) (conn)->m->set_client_option((conn), (opt), (value) TSRMLS_CC)
mysqlnd.c:MYSQLND_METHOD(mysqlnd_conn, set_client_option)
...
case MYSQL_SET_CHARSET_NAME:
...
conn->options.charset_name = new_charset_name;
mysqlnd.c: /* {{{ mysqlnd_connect_run_authentication */
static enum_func_status
mysqlnd_connect_run_authentication(
....
if (options->charset_name && (charset = mysqlnd_find_charset_name(options->charset_name))) {
auth_packet->charset_no = charset->nr;
} else {
#if MYSQLND_UNICODE
auth_packet->charset_no = 200;/* utf8 - swedish collation, check mysqlnd_charset.c */
#else
auth_packet->charset_no = greet_packet->charset_no;
#endif
}
таки задается кодировка соединения, передаваемая при аутентификации (видимо первым же пакетом при установке соединения). Это если с mysqlnd собрано (обычно с ним собирают), libmysqlclient смотреть лениво
а mysql_set_charactet_set там нафиг не надо, ибо prepared statements