声明:本文适用于在Linux(也许仅限于Ubuntu)中,使用C语言读取MySQL中存储的数据时显示的中文都是???的情况。
不是为了说一个简单的“Mysql不支持中文”(即用的仅仅是Mysql本身,自始至终不用离开mysql的终端的 (mysql > ),比如不是用编程语言从数据库里读东西)。而且这种所谓的不支持中文也很容易解决,我所知道的最简单的方法就是不用varchar 而使用nvarchar即可插入输出中文都没问题。
MySQL不支持中文可不是个稀罕问题,我遇到了这个问题之后赶紧去网上查,结果无数哥们们的技术文章都告诉我要:
先root打开my.cnf文件,然后修改里面的设置,比如 [mysql]里面的, [mysqld]里面的, [mysql-safe]里面的,[client]里面的或者 [server] 里面的内容等等,基本上无非是加上一句 set_default_charcter=utf8 之类。然后再重启mysql服务等等。我试了这个试那个,结果事实告诉我要不然用C语言在终端里面读出来的依旧是问号,1要不然就是再也无法启动mysql服务,报错说 什么什么.sock 之类的错误。
以上为背景,以免误导他人。
为解决我面临的这种问题,要加上一行代码就可以解决这个问题了。
下面是我的实例代码:
#include<stdio.h>
#include<mysql/mysql.h>
#include<assert.h>
int main(){
MYSQL* mysql;
mysql=mysql_init(NULL);
mysql=mysql_real_connect(mysql,"localhost","root","123","mydatabase",0,NULL,0);
//其实你需要的就是这行下面的部分
int utf8;
utf8=mysql_query(mysql,"set character_set_results=utf8");
printf("utf8=%d\n",utf8);
assert(utf8==0); //其实你需要的就是这行上面的部分 然后你就什么都会了,这四行代码以上和以下的代码几乎都是没有意义的,因为这不是个问题
MYSQL_RES* result;
MYSQL_ROW row;
int ret;
ret=mysql_query(mysql,"select * from zhaos");
assert(ret==0);
printf("select finished\n");
result=mysql_store_result(mysql);
int num;
num=mysql_num_rows(result);
printf("ROWS= %d\n",num);
while((row=mysql_fetch_row(result))!=NULL){
printf("%s\n",row[0]?row[0]:"NULL");
mysql_free_result(result);
mysql_close(mysql);
return 0;
}
}