c++ mysql中文乱码_c++ poco 使用mysql中文乱码问题
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_name
Use 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 is
that output from the mysql client is formatted incorrectly, due to the fact that the MySQL client uses the
latin1 character set by default. You can usually fix such issues by using this option to force the client
to 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 session
Session session(SessionFactory::instance().create("MySQL", "user=root;password=888;db=test"));
很自然的先去SessionFactory.cpp看是否有這個設置(Data/src/SessionFactory.cpp),沒發現線索。
再去(Data/MySQL/src/)下面看看
先看Connector.cpp這個文件,發現一點點線索
Poco::AutoPtr<:data::sessionimpl> Connector::createSession(const std::string& connectionString)
{
return Poco::AutoPtr<:data::sessionimpl>(new SessionImpl(connectionString));
}
就是SessionImpl這個類型,這是真正的實現類
打開同目錄下SessionImpl.cpp文件,發現這個類的構造函數中包含對connectionString的解析
std::map<: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, );
if (res != )
{
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 != )
{
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,);
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",,NULL,))
{
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 != )
{
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添加其它設置支持。
解決springmvc+mybatis+mysql中文亂碼問題【轉】
這篇文章主要介紹了解決java中springmvc+mybatis+mysql中文亂碼問題的相關資料,需要的朋友可以參考下 近日使用ajax請求springmvc后臺查詢mysql數據庫,頁面顯示中文 ...
總結--解決 mysql 中文亂碼
首先分析一下導致mysql 中文亂碼的原因: 1.建表時使用了latin 編碼 2.連接數據庫的編碼沒有指定 3.寫入時就已經亂碼(這種情況需要自己檢查源數據了) 解決方法總結: 1.創建庫時指定編碼 ...
Servlet、MySQL中文亂碼
1.Servlet中文亂碼: 在doPost或doGet方法里,加上以下兩行即可: response.setContentType("text/html;charset=UTF-8" ...
php mysql 中文亂碼解決方法
本文章向碼農們介紹php mysql 中文亂碼解決方法,對碼農們非常實用,需要的碼農可以參考一下. 從MySQL 4.1開始引入多語言的支持,但是用PHP插入的中文會出現亂碼.無論用什么編碼也不行 解 ...
windows mysql 中文亂碼和中文錄入提示太大錯誤的解決方法
今天操作mysql的時候很郁悶,因為修改默認字符集搞了半天,終于弄成了(關于如何把windows的默認字符集設置成功,可以參看另一篇博文,最終在mysql中輸入show variables like ...
MySQL編程(0) - Mysql中文亂碼問題解決方案
MySQL 5.6 for Windows 解壓縮版配置安裝: http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html MySQL ...
MySQL及navicat for mysql中文亂碼
轉載自:https://www.cnblogs.com/mufire/p/6697994.html 修改完之后記著重啟mysql服務,在服務里邊重啟,即可生效! 全部使用utf8編碼 MySQL中文亂 ...
通過msyql proxy鏈接mysql中文亂碼及session問題
1.session問題 問題前提:一臺機數據庫為兩個實例,通過不同的socket監聽不同端口對外提供服務.不同的站點都訪問同一個VIP不同的端口進行訪問數據庫. 故障現象:一旦有一個站點先用了這個vi ...
可遇不可求的Question之導入mysql中文亂碼解決方法篇
可遇不可求的Question之導入mysql中文亂碼解決方法篇 先 set names utf8;然后 source c:\1.sql ?
隨機推薦
NHibernate實戰詳解(一)領域模型設計
關于NHibernate的資料本身就不多,中文的就更少了,好在有一些翻譯文章含金量很高,另外NHibernate與Hibernate的使用方式可謂神似,所以也有不少經驗可以去參考Hibernate. ...
Java初學之華容道游戲
package hhuarongdao; public class example { public static void main(String args[]) { new Hua_Rong_Ro ...
Sublime Text 教程
編輯器的選擇(Editor Choices) 從初學編程到現在,我用過的編輯器有EditPlus.UltraEdit.Notepad++.Vim.TextMate和Sublime Text,如果讓我從 ...
encodeURI和encodeURIComponent的比較
encodeURI和encodeURIComponet函數都是javascript中用來對URI進行編碼,將相關參數轉換成UTF-8編碼格式的數據.URI在進行定位跳轉時,參數里面的中文.日文等非AS ...
@property、@synthesize和dynamic的用法
原文: ?http://blog.csdn.net/hherima/article/details/8622948 @代表“Objective-C”的標志,證明您正在使用Objective-C語言 O ...
random-----隨機數
1 import random 2 3 print(random.random())#(0,1)----float 大于0且小于1之間的小數 4 5 print(random.randint(1,3) ...
OpenStack 安裝:neutron服務
在上一篇中介紹了Nova的安裝配置,這一篇介紹neutron 首先,創建neutron用戶并設置密碼為neutron [root@linux-node1 ~]# openstack user crea ...
集合總結--ArrayList、LinkedList、HashMap
一.概述 ? ? ? ?ArrayList:數組集合. 查詢.修改.新增(尾部新增)快,刪除.新增(隊列中間)慢,適用于查詢.修改較多的場景. ? ? ? ?LinkedList:雙向鏈表集合.查 ...
java命令--jstack 工具 查看JVM堆棧信息
介紹 jstack是java虛擬機自帶的一種堆棧跟蹤工具.jstack用于打印出給定的java進程ID或core?file或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項" ...
總結
以上是生活随笔為你收集整理的c++ mysql中文乱码_c++ poco 使用mysql中文乱码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 2588 Spoj 10628
- 下一篇: node process.env.NOD