Linux编程向Mysql插入中文数据显示乱码的解决方法

来源:互联网 发布:java主函数的写法 编辑:程序博客网 时间:2024/05/16 09:08

最近写了个C++程序,其中有用到向Mysql中插入中文数据, 结果却出现乱码,经过上网查询资料和本人试验,终于解决了这个问题,现把方法说明如下:

首先说明Mysql中的字符集和校对规则。字符集是用来定义Mysql存储字符的方式,校对规则定义了字符串的比较方式。常用的字符集有GB2312(支持简体中文)、GBK(支持简体中文和繁体中文)、BIG5(支持繁体中文)、UTF8(基本上支持所有字符)。Mysql中主要涉及到以下几个字符集:服务器字符集、数据库、数据表、表中的的字段字符集、客户端字符集、连接字符集。

要处理中文,需要将character_server_set,character_client_server设置为utf8。方法如下:

在 [mysqld]中添加:

default_character_set=utf8

在[client]中添加:

default_character_set=utf8


重启mysqld服务:service mysqldrestart

进入mysql,查看字符集的情况,在命令行中输入命令:show variableslike ‘character_set_%’;

 

 好了,现在是解决中文乱码的关键步骤了。将Mysql以下三个系统参数设置为与服务器字符集character_set_server相同的字符集。

character_set_client:客户端的字符集

character_set_results:结果字符集

character_set_connection:连接字符集

设置这三个系统参数的命令:set names ‘utf8’

这三个系统参数的作用:

信息输入路径: client--connection--server (数据传送方向从左到右)

信息输出路径: server--connection--results (数据传送方向从左到右)

故这几个系统参数的值须相同,不然以不同的编码方式传送数据,若编码方式不兼容,则容易造成乱码的问题。

以下是用来测试的程序。(数据库名One,表名student,字段sno,sname)

#include<iostream>#include<mysql/mysql.h>using namespace std;int main(void){    MYSQL mysql;    mysql_init(&mysql);    if(!mysql_real_connect(&mysql, "192.168.199.117", "root", NULL, "One", 0, NULL, 0))    {        cout<<mysql_error(&mysql)<<endl;    }    if(mysql_query(&mysql, "set names \'utf8\'"))  //这个是关键    {        cout<<mysql_error(&mysql)<<endl;    }    char query[1024] = {0};    sprintf(query, "update student set sname = \'优酷视频-大话西游\' where sno = 1000");    cout<<query<<endl;    if(mysql_query(&mysql, query))    {        cout<<mysql_error(&mysql)<<endl;    }    mysql_close(&mysql);    return 0;}

运行结果

 若对已存在的数据库进行中文插入,除了上述步骤外,还需要修改数据库、表中字段(要插入中文的字段)的字符集。修改方式参考网上资料,这里不再详述。

原创粉丝点击