Description:
The SQL parser is not capable of parsing any UCS2 strings, but allows the client to request it with
> SET character_set_client = ucs2;
How to repeat:
In 5.0+ UCS2 as result is supported:
> SET character_set_results = ucs2;
> SELECT @@character_set_results;
| u c s 2 |
(\0u\0c\0s\0002)
> SET character_set_client = ucs2;
> \0S\0E\0L\0E\0C\0T\0 \0001
fails with:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\' at line 1
> SELECT 1
fails with:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'SELECT 1\' at line 1
... this is the wrong byte-stream for the charset, but it shows that somewhere internally something is expecting UCS2 now.
Test-Code:
#include <stdio.h>
#include <mysql.h>
#define C(x) x, sizeof(x) - 1
int exec_select(MYSQL *mysql, const char *q, size_t q_len) {
MYSQL_RES *res;
if (mysql_real_query(mysql, q, q_len)) {
fprintf(stderr, "%s.%d: mysql_real_query(%s) failed: %s",
__FILE__, __LINE__,
"",
mysql_error(mysql));
return 0;
}
if (NULL != (res = mysql_store_result(mysql))) {
mysql_free_result(res);
}
return 0;
}
int main() {
MYSQL *mysql;
mysql = mysql_init(NULL);
if (!mysql_real_connect(mysql, "127.0.0.1", "root", "", "", 3306, NULL, 0)) {
fprintf(stderr, "%s.%d: mysql_real_connect() failed: %s", __FILE__, __LINE__, mysql_error(mysql));
return -1;
}
#if 0
exec_select(mysql, C("SET character_set_results = ucs2"));
exec_select(mysql, C("SELECT @@character_set_results"));
#else
exec_select(mysql, C("SET character_set_client = ucs2"));
exec_select(mysql, C("\0S" "\0E" "\0L" "\0E" "\0C" "\0T" "\0 " "\0""1"));
exec_select(mysql, C("SELECT 1"));
#endif
mysql_close(mysql);
return 0;
}
Suggested fix:
return an error for:
SET character_set_client = ucs2;