#include #include #define ZERO(F) \ if (F) {\ printf("Error: 0 != %s\n", #F);\ printf("%s\n", mysql_error(mysql));\ exit(1);\ } else\ printf("OK: %s\n", #F); #define NONZERO(F) \ if (!(F)) {\ printf("Error: 0 == %s\n", #F);\ exit(1);\ } else\ printf("OK: %s\n", #F); #define ONE(F) \ if (!(1==(F))) {\ printf("Error: %s != 1\n", #F);\ exit(1);\ } else\ printf("OK: %s == 1\n", #F); #define DROP "DROP TABLE IF EXISTS t1" #define CREATE "CREATE TABLE t1 (c1 CHAR(10) CHARSET latin1)" #define INSERT "INSERT INTO t1 VALUES ('Muller'), ('M\xFCller'), ('Möller')" #define SELECT1 "SELECT * FROM t1 WHERE c1 = 'Müller'" // UTF8(C3BC) = U+00FC = LATIN SMALL LETTER U WITH DIAERESIS #define SELECT2 "SELECT * FROM t1 WHERE c1 = 'M\xC3\xBCller'" // UTF8(D0B9) = U+0439 = CYRILLIC SMALL LETTER SHORT I #define SELECT3 "SELECT * FROM t1 WHERE c1 = 'M\xD0\xB9ller'" // UTF8(D0C9) is illegal utf8 sequence #define SELECT4 "SELECT * FROM t1 WHERE c1 = 'M\xD0\xC9ller'" int main(void) { MYSQL *mysql; MYSQL_RES *res; //latin1 connection NONZERO(mysql= mysql_init(NULL)); ZERO(mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "latin1")); NONZERO(mysql_real_connect(mysql, "localhost", "root", NULL, "test", 0, NULL, 0)); //create + populate test table ZERO(mysql_query(mysql, DROP)); ZERO(mysql_query(mysql, CREATE)); ZERO(mysql_query(mysql, INSERT)); //latin1 select ZERO(mysql_query(mysql, SELECT1)); NONZERO(res= mysql_store_result(mysql)); ONE(mysql_num_rows(res)); mysql_close(mysql); //utf8 connection NONZERO(mysql= mysql_init(NULL)); ZERO(mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8")); NONZERO(mysql_real_connect(mysql, "localhost", "root", NULL, "test", 0, NULL, 0)); //utf8 select #1 //U+00FC is in latin1, conversion sucessfull ZERO(mysql_query(mysql, SELECT2)); NONZERO(res= mysql_store_result(mysql)); ONE(mysql_num_rows(res)); //utf8 select #2 //U+0439 is not in latin1, conversion fails NONZERO(mysql_query(mysql, SELECT3)); printf("%s\n", mysql_error(mysql));\ //utf8 select #3 //illegal utf8 sequence NONZERO(mysql_query(mysql, SELECT4)); printf("%s\n", mysql_error(mysql));\ //cleanup ZERO(mysql_query(mysql, DROP)); mysql_close(mysql); }