linux下 c++ 生成sql 存入数据库乱码
来源:互联网 发布:职场动物进化手册知乎 编辑:程序博客网 时间:2024/06/11 04:44
如题,被这个问题困扰了好久。
1. 客户端发来了数据,在terminal中输出,显示的中文正常。
2. 在网上搜索后,发现可能是mysql的设置问题,于是设置了mysql的配置文件,将所有的字符集都设置为utf8
尝试了重启服务,但是并没有生效,当时很是无语,但是关机后,第二天开机就生效了(无奈)。
3. 当mysql所有的字符集设置成utf8后,程序中添加到mysql中的中文还是乱码。
4. 在terminal下面使用 mysql -uroot -p 登陆后,查看 show variables like 'character%';的设置都为utf8,尝试添加中文,显示均为正常
5. 回到程序中,问题仍然存在。
6. 在ide下面 cout << sql << endl; 也是现实的正常。
于是刚刚换了个思路,思考是否是与系统本身的字符集有关,或者是标准c++ 语言有关,可是这个年头很快就被打消了。
在windows下的api还有A版和W版的区别,因此不会是由于语言本身造成的。
然后就看到了这篇文章 http://outofmemory.cn/code-snippet/3583/linux-cpp-connect-mysq
在文章中有这样一段代码
#include <iostream>using namespace std;#include <stdio.h>#include <string.h>#include <stdlib.h>#include <mysql/mysql.h>#include <syslog.h>#include <iconv.h>int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen){ iconv_t cd; int rc; char **pin = &inbuf; char **pout = &outbuf; cd = iconv_open(to_charset,from_charset); if (cd==0) return -1; memset(outbuf,0,outlen); size_t in_buf=inlen; size_t out_buf=outlen; if (iconv(cd,pin,&in_buf,pout,&out_buf)==-1) return -1; iconv_close(cd); return 0;}int u2g(char *inbuf,int inlen,char *outbuf,int outlen){ return code_convert((char *)"utf-8",(char *)"gb2312",inbuf,inlen,outbuf,outlen);}int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen){ return code_convert((char *)"gb2312",(char *)"utf-8",inbuf,inlen,outbuf,outlen);}int main(){ MYSQL mysql; char host[32] = "127.0.0.1"; char user[32] = "root"; char passwd[32] = "763092"; char db[32] = "my_db"; if( mysql_init(&mysql) == NULL ) { fprintf(stderr,"Init mysql err!"); return -1; } if (mysql_real_connect(&mysql,host,user,passwd,db,0,NULL,0) == NULL) { fprintf(stderr,"Connect to mysql Error:%s! \n",mysql_error(&mysql)); return -1; } else { puts("Connect to mysql success! \n"); } mysql_query(&mysql,"set names 'GBK'"); //// 这行很重要,向你的程序说明,是以GBK字符集连接到MYSQL数据库,如果数据库使用的是utf8,这里改为 "set names 'utf8'" MYSQL_ROW m_row; MYSQL_RES *m_res; char sql[1024]; char out_buf[128]; char in_buf[]="中国zhongguo"; u2g(in_buf,strlen(in_buf),out_buf,sizeof(out_buf)); //转为gbk 字符集 存在out_buf 中 sprintf(sql,"insert into test (name,age) values('%s',21)",in_buf); mysql_query(&mysql,sql); // 把gbk 内容存到数据库当中去, 注意 数据库当中此例的字符集一定要为gbk2312 sprintf(sql,"select * from test"); if(mysql_query(&mysql,sql) != 0) { fprintf(stderr, "mysql_query err: %s \n",mysql_error(&mysql)); } m_res = mysql_store_result(&mysql); if(m_res==NULL) { fprintf(stderr, "get result err: %s",mysql_error(&mysql)); } while(m_row = mysql_fetch_row(m_res)) { bzero(out_buf,sizeof(out_buf)); g2u(m_row[1],strlen(m_row[1]),out_buf,sizeof(out_buf)); // 查出来,要对其进行转换为utf-8,不然控制台不能正常 显示 printf(" %d , %s , %d \n",atoi(m_row[0]),out_buf,atoi(m_row[2])); } mysql_free_result(m_res); mysql_close(&mysql); return 0;}突然就注意到了这篇文章中, 在mysql_real_connect 之后 有一句 mysql_quer(&mysql, "set names utf8"); 表明链接数据库时用utf8可是我之前也有在terminal下面 设置过呀, 可是问题没解决呀?恍然大悟,其实问题是解决了,在terminal下面输入中文是一点问题都没有的。而在terminal下面连接数据库之后,terminal就相当于一个client,在terminal下面进行的设置是跟程序本身分开的。于是在自己的程序中也进行了这样的设置,然后问题就solved了!
阅读全文
0 0
- linux下 c++ 生成sql 存入数据库乱码
- IE下表单提交存入数据库乱码
- 照片存入数据库中C#(SQL)
- 存入数据库乱码
- ssh存入数据库乱码问题
- 解决存入数据库乱码问题
- 中文存入数据库乱码问题
- hibernate存入数据库乱码mysql
- 解决存入数据库乱码问题
- 数据存入数据库乱码问题
- linux下oracle数据库执行sql脚本乱码问题
- MySQL数据库乱码-Linux下乱码问题
- 解决JSP存入数据库乱码问题
- 数据库存入字符乱码,未解决
- 兔子--中文存入mysql数据库显示乱码
- php使用jsonjson_encode存入数据库乱码
- mysql中文存入到数据库乱码
- 前台提交servlet存入数据库乱码问题
- CentOS 7 安装 Nginx 1.11.x
- 获取不同长度的UUID
- STL中vector的使用
- spring boot使用内嵌的tomcat解决不安全的HTTP方法安全漏洞
- 士兵杀敌(二)
- linux下 c++ 生成sql 存入数据库乱码
- 欢迎使用CSDN-markdown编辑器
- spring MVC:前端页面需要多显示一列,后端每层均需增加字段
- HDU6070(分数规划+线段树)
- React高阶组件
- 面试题
- spring中Bean的个人理解
- PHP 超级全局变量
- IntelliJ使用Maven创建SpringMVC服务