最近用C語言連接數據庫,插入數據時如果數據中存在漢字,插入會失敗。最後搞明白了是MySQL使用的字符集的問題。
1、如何查看當前連接的數據庫使用的字符集
MySQL提供的接口函數prototype爲:
void STDCALL mysql_get_character_set_info(MYSQL *mysql,
MY_CHARSET_INFO *charset);
其中 MY_CHARSET_INFO 結構體定義如下:
typedef struct character_set { unsigned int number; /* character set number */ unsigned int state; /* character set state */ const char *csname; /* collation name */ const char *name; /* character set name */ const char *comment; /* comment */ const char *dir; /* character set directory */ unsigned int mbminlen; /* min. length for multibyte strings */ unsigned int mbmaxlen; /* max. length for multibyte strings */ } MY_CHARSET_INFO;
調用上述函數並打印結果:
MY_CHARSET_INFO charset; mysql_get_character_set_info(mysql, &charset); printf("character set number:%d\n", charset.number); printf("character set state:%d\n", charset.state); printf("collation name:%s\n", charset.csname); printf("character set name:%s\n", charset.name); printf("comment:%s\n", charset.comment); printf("character set directory:%s\n", charset.dir); printf("min. length for multibyte strings:%d\n", charset.mbminlen); printf("max. length for multibyte strings:%d\n", charset.mbmaxlen);
結果如下:
可以看出當前數據庫使用的字符集爲latin1。現在還不知道爲什麼插入漢字會提示出錯,雖然客戶端、連接、數據庫三個方面使用的字符集都是latin1,按理說latin1使用了字節的所有8位空間,不管什麼字節流過來都不會報錯。
2、如何修改當前連接使用的字符集
MySQL提供的接口函數prototype爲:
int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname);
成功返回0,失敗返回非0。
在網上查資料有人說使用"utf8",我試了一下,發現還是不行。使用“GBK”可以:
if (!mysql_set_character_set(mysql, "GBK")) { printf("New connection character set: %s\n", mysql_character_set_name(mysql)); }
其字符集信息如下:
The End.