poco 是c++ 一个比较好的库,现在正在学习使用它,碰到一些问题记录在此。

poco版本:poco-1.46-all ,带有数据库的支持模块

操作系统:ubuntu

1.使用poco的MySQL模块连接数据库,中文出现乱码

使用的例子是/poco-1.46-all/Data/samples/sqlite改的MySQL

mysql服务器的test数据库,全部是utf-8格式(数据库是8,表也是utf8),但是使用poco连接后,带中文的字段出现乱码

在命令行中输入

man mysql

MYSQL OPTIONS 节,看见如下设置

--default-character-set=charset_nameUse charset_name as the default character set for the client and connection.A common issue that can occur when the operating system uses utf8 or another multi-byte character set isthat output from the mysql client is formatted incorrectly, due to the fact that the MySQL client uses thelatin1 character set by default. You can usually fix such issues by using this option to force the clientto use the system character set instead.See Section 10.5, “Character Set Configuration”, for more information.

关键就是这里,default-character-set对应的编码要和数据库的test库的编码一致

也就是说default-character-set设置为utf8才对

怎么在poco的mysql模块设置这个编码呢

看poco中的连接mysql代码如下:

    // register MySQL connector
    Poco::Data::MySQL::Connector::registerConnector();// create a sessionSession session(SessionFactory::instance().create("MySQL", "user=root;password=888;db=test"));

很自然的先去SessionFactory.cpp看是否有这个设置(Data/src/SessionFactory.cpp),没发现线索。

再去(Data/MySQL/src/)下面看看

先看Connector.cpp这个文件,发现一点点线索

Poco::AutoPtr<Poco::Data::SessionImpl> Connector::createSession(const std::string& connectionString)
{return Poco::AutoPtr<Poco::Data::SessionImpl>(new SessionImpl(connectionString));
}

就是SessionImpl这个类型,这是真正的实现类

打开同目录下SessionImpl.cpp文件,发现这个类的构造函数中包含对connectionString的解析

std::map<std::string, std::string> options;

解析的结果全部放入上述的options中,

再朝下看,发现

//// Options//
if (options["compress"] == "true"){_mysql.options(MYSQL_OPT_COMPRESS);}else if (options["compress"] == "false"){// do nothing
    }else if (options["compress"] != ""){throw MySQLException("create session: specify correct compress option (true or false) or skip it");}

还记得最开始的命令行 man mysql不,在 MYSQL OPTIONS 节其中就有一个compress的参数

_mysql.options(MYSQL_OPT_COMPRESS);

上述代码描述了怎么设置compress参数,看一下_mysql的类型

(Data/MySQL/include/Poco/Data/MySQL/sessionImpl.h)

SessionHandle _mysql;

是SessionHandle,然后查看(Data/MySQL/src/),SessionHandle.cpp(或SessionHandle.h)

void SessionHandle::options(mysql_option opt)
{int res = mysql_options(h, opt, 0);if (res != 0){throw ConnectionException("mysql_options error", h);}
}void SessionHandle::options(mysql_option opt, bool b)
{my_bool tmp = b;int res = mysql_options(h, opt, &tmp);if (res != 0){throw ConnectionException("mysql_options error", h);}
}

这里就是设置mysql options参数的地方,看见关键函数mysql_options

去google上查一下 mysql_options

这个http://dev.mysql.com/doc/refman/5.1/en/mysql-options.html

其中发现

MYSQL_OPT_COMPRESS (argument: not used) 

 MYSQL_SET_CHARSET_NAME (argument type: char *)The name of the character set to use as the default character set. 

很明显现在我需要设置的 MYSQL_SET_CHARSET_NAME这个参数,它是个字符串类型

前面有个 compress的参数,它是bool的

找遍SessionHandle.cpp (.h)只有两个重载

void SessionHandle::options(mysql_option opt)void SessionHandle::options(mysql_option opt, bool b)

没有设置字符串类型的,那么我们自己动手写了

继续看 http://dev.mysql.com/doc/refman/5.1/en/mysql-options.html

在最下面有例子

MYSQL mysql;mysql_init(&mysql);
mysql_options(&mysql,MYSQL_OPT_COMPRESS,0);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");
mysql_options(&mysql,MYSQL_INIT_COMMAND,"SET autocommit=0");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{fprintf(stderr, "Failed to connect to database: Error: %s\n",mysql_error(&mysql));
}

mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");这行就是设置字符串的

现在需要在SessionHandel.h增加一个函数声明
void options(mysql_option opt, char *c);

同时在SessionHandel.cpp实现
void SessionHandle::options(mysql_option opt, char *c)
{int res = mysql_options(h, opt, c);if (res != 0){throw ConnectionException("mysql_options error", h);}
}

在SessionImpl.cpp文件的构造函数,最后如下

//
// Real connect
//

字符串之前增加如下语句
if (options["default-character-set"] != "")
{_mysql.options(MYSQL_SET_CHARSET_NAME, options["default-character-set"].c_str());
}


最后,把开始的poco中的连接mysql代码改成如下
    // register MySQL connector
    Poco::Data::MySQL::Connector::registerConnector();// create a session//Session session("user=root;password=888;db=test");Session session(SessionFactory::instance().create("MySQL", "user=root;password=888;db=test;default-character-set=utf8"));

编译,并查看一下,中文不再乱码了,^_^

使用相同的方法,可以给poco的mysql添加其它设置支持。

转载于:https://www.cnblogs.com/simfe/p/3162584.html

c++ poco 使用mysql中文乱码问题相关推荐

  1. Servlet、MySQL中文乱码

    1.Servlet中文乱码: 在doPost或doGet方法里,加上以下两行即可: response.setContentType("text/html;charset=UTF-8" ...

  2. tomcat mysql 中文乱码_tomcat 中文乱码, mysql 中文乱码_MySQL

    Tomcat tomcat中文乱码 get 请求. 修改server.xml中的添加URIEncoding='UTF-8' tomcat中文乱码 post 版 另外HttpURLConnection上 ...

  3. python查询mysql中文乱码问题

    相信很多在工作中的Python小伙伴,经常会遇到一些工作上的问题,例如查询mysql中文乱码问题,Python连接mysql数据库时,读取数据库中的中文出现乱码,所有中文都显示为问号了,那么该如何解决 ...

  4. Mysql 中文乱码问题完美解决方案

    Mysql 中文乱码问题完美解决方案 参考文章: (1)Mysql 中文乱码问题完美解决方案 (2)https://www.cnblogs.com/fangyh/p/6286699.html 备忘一下 ...

  5. MySQL编程(0) - Mysql中文乱码问题解决方案

    MySQL 5.6 for Windows 解压缩版配置安装: http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html MySQL ...

  6. 图形化mysql出现乱码_关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)...

    最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅. 首先: 用show variables like &quo ...

  7. mysql linux 中文乱码_解决MySQL中文乱码的问题

    遇到MySQL中文乱码问题,首先用status命令检查数据库的配置,如下: 上图会显示数据库配置的各项信息. 还可以用 show create database XXX,来显示创建数据库的时候的编码设 ...

  8. Qt 解决MySQL 中文乱码问题

    文章目录 Qt 解决MySQL 中文乱码问题 解决此问题的必要前提就是: 1.版本要匹配. 2.数据库连接正常,需要重新编译Qt 自带的源程序中的mysql.pro 工程项目: 3.数据库的编码格式与 ...

  9. php输出查询mysql中文乱码_解决php mysql查询插入中文乱码问题

    一.中文问题其实就是经统一编码了否则就会乱码 1.数据库与php页面编码统一 2.数据库数据表字段与页面编码统一 如果做到上面两种就不存在中文乱码问题了,那么我们来看mysql中文乱码问题解决例子 1 ...

  10. mysql中文乱码解决方案_Mysql中文乱码解决方案

    Mysql中文乱码解决方案 时间:2017-07-11     来源:华清远见JAVA学院 中文乱码问题一直是我们编程过程中比较常见又让人头疼的问题,但是只要按照标准进行配置,就能很好的避免出现中文乱 ...

最新文章

  1. 局域网内计算机可以互访 无法上互联网,我使用路由器后访问互联网正常,但是网上邻居不能互访,怎么办?...
  2. iOS App Launch Option
  3. 【实用】批量成本估算
  4. 什么是地理数据库geodatabase?
  5. Springboot @Transactional Mysql事务 无效
  6. Centos8安装X11-forwarding图形服务
  7. TCP和UDP,HTTP和HTTPS
  8. java.lang.NoClassDefFoundError: org/jdom/input/SAXBuilder
  9. vs生成命令和属性的宏
  10. 引用原话,不等于原意
  11. 素材解析程序源代码,用thinkphp开发的 支持12大网站,其他需要定制
  12. Eclipse ADT插件和主题
  13. 好用的内网穿透工具汇总
  14. 跨界程序员の一 中文GB2312字库下载
  15. 通过锂电池原理来设计BMS系统
  16. 给程序员的 2018 新年计划清单
  17. 如何学习(1):构建全栈式知识结构
  18. 影视剧作中的经典桥段部分
  19. scala 读取txt文件(从文件读取)
  20. 手把手教你打通车载蓝牙与手机app的音频信息传输车载反向控制手机app

热门文章

  1. SharePoint2010内容类型剖析(三)
  2. LinkButton回发报错__doPostBack('……','') 缺少对象
  3. m1系统怎么重装,m1芯片怎么重装系统,苹果M1芯片重装系统,m1芯片重新安装mac
  4. react-router中进行路由控制
  5. Mac硬盘格式转化好帮手——Tuxera NTFS
  6. 面向对象PHP之Clone对象
  7. AE中网络分析的实现 的各个类之间的关系
  8. 关于5G你所需要知道的一切
  9. H5页面快速搭建之高级字体应用实践
  10. Java学习笔记(三):数组