• 27513阅读
  • 22回复

[提问]在Qt4中使用MySQL4.1及其以上版本中的中文问题解决方法 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2006-04-24
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
MySQL4.1及其以上版本中中文问题比较麻烦,有时候在QT中使用会出现问号或者乱码,现在说明一下在Qt中如何正确地配合使用。
先在MySQL中建表,使用中文,一般情况下就两种,GB(GB2312或者GBK)或者UTF8两种。两种的解决方法是相似的,这里我们以GBK为例说明。

一、数据库和表以及表里的字符相关字段(varchar, char, text等)都要使用gbk_chinese_ci这种方式,不这样做也可以,但这样做,会省很多麻烦。
二、重新编译Qt的MySQL驱动,需要修改src/sql/drivers/mysql/qsql_mysql.cpp文件。
要修改的部分如下:第一百零八行的codec函数,注意红色加粗部分,是我修改增加的语句。

tatic QTextCodec* codec(MYSQL* mysql)
{
  return QTextCodec::codecForName("GBK");
#if MYSQL_VERSION_ID >= 32321
  QTextCodec* heuristicCodec = QTextCodec::codecForName(mysql_character_set_name(mysql));
  if (heuristicCodec)
    return heuristicCodec;
#endif
  return QTextCodec::codecForLocale();
}

然后,重新编译qt的mysql驱动,这里就不多说了,请查看Qt相关文档
三、在Qt程序main函数中app后面开头处加入下面两句,加上这两个是省得不必要的麻烦。

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
  QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
//QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

四、在Qt数据库连接后,运行SET NAMES 'GBK'语句(红色部分)。

db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("yourdatabase");
db.setUserName("yourusername");
db.setPassword("yourpassword");
db.open();
db.exec("SET NAMES 'GBK'");

OK, 走过上面四步以后,我们就可以在程序中正确使用查看MySQL中的中文数据了。
但是如果你要直接通过SQL语句修改数据,则需要正确的把输入的内容转变为GB码中,
比如:

  QTextCodec *codec = QTextCodec::codecForName("GBK");
  QString strOut = codec->fromUnicode(lineEdit->text()).data();
  QString strSql = "UPDATE user SET uinfo = '" + strOut + "'";
  db.exec(strSql);

这里需要注意的是,如果设置了codecForTr也为GBK的话,那就不用上面的手动转换步骤了,即,如果在第三步中把第三行的注释去掉,则上面的字符串格式转换就不需要了。

这里面最关键的一点就是修改qsql_mysql.cpp文件,因为它不能正确的设置codec内码。

如果数据库中的编码使用的是UTF8,则把上面相关的部分改为UTF-8(Qt)或者UTF8(MySQL)就行了。
[ 此贴被XChinux在2006-05-17 17:02重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线lfm
只看该作者 1楼 发表于: 2006-05-27
根据实际测试(WINXP+MYSQL5+QT4+MinGW),只要做以下步骤就行了:
1、关于第一步:这一步很重要,做了就很省事;
2、关于第二步:可省,不需要修改驱动源码;
3、关于第三步:只要增加第二行命令就可以正确写入中文字符了;
4、关于第四步:这步不能少,否则不能正确读取中文字符;
5、最后一步不需要。
谢谢总版主!
离线XChinux

只看该作者 2楼 发表于: 2006-05-27
关于第二步修改源码,在WINDOWS下我测试的确实不需要修改就能行,但在LINUX下,我测试的它不能正确识别编码,所以得修改源码。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线mileden

只看该作者 3楼 发表于: 2006-06-03
我在 Qt 程序中使用 tr 函数出现了乱码,该怎么解决?如:

tr(在Qt4中使用MySQL4.1及其以上版本中的中文问题解决方法)
离线XChinux

只看该作者 4楼 发表于: 2006-06-03
引用第3楼mileden2006-06-03 12:59发表的“”:
我在 Qt 程序中使用 tr 函数出现了乱码,该怎么解决?如:
tr(在Qt4中使用MySQL4.1及其以上版本中的中文问题解决方法)


setCodecForTr()
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线minifat

只看该作者 5楼 发表于: 2007-03-28
我这里Qt4不用修改源代码,读写都正常的(在Windows,Linux(utf,GBK)下测试)。
关键是设置mysql的编码。
离线XChinux

只看该作者 6楼 发表于: 2007-03-28
没查看新版本中的Qt的MySQL插件是否已经更正了。应该是以前的一个小问题吧。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线aaniao999

只看该作者 7楼 发表于: 2007-04-18
谢谢了,这9正学到这,但是我连MYSQL都不会用,直接就没见过,大家怎么架设环境的,用的是设呢么软件,WINDOWS下面和LINUX下面用的是什么?
离线XChinux

只看该作者 8楼 发表于: 2007-04-18
到mysql.com上下载一个就行。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线蛮蛮
只看该作者 9楼 发表于: 2007-04-19
tr(在Qt4中使用MySQL4.1及其以上版本中的中文问题解决方法)
还能这样用?我还以为要在字符串外面加上双引号呢
蛮蛮工作室
离线slient
只看该作者 10楼 发表于: 2007-05-12
不好意思,请问第一步是怎么做?用什么命令,谢谢
离线slient
只看该作者 11楼 发表于: 2007-05-14
在Qt3中这种方法是不是行不通?该用什么方法
离线jxxfjun

只看该作者 12楼 发表于: 2007-11-25
最新的4.3.2已不用这么麻烦了:
1.在Main 的 app 后面用QTextCodec::setCodecForTr(QTextCodec::codecForLocale())
2.所有有中文输出的地方用tr()包住
3.在连接数据库后用加入一句db.exec("set names 'utf8'") (我的是utf8)

如果你要在数据库中直接查询也要先set names 'utf8'
好了
离线yshadow

只看该作者 13楼 发表于: 2008-04-24
在MFC显示MySQL不会出现问题,
但Qt4里显示乱码,谢!
离线superyongzhe

只看该作者 14楼 发表于: 2008-05-20
谢谢!!!!!!1
有付出才有回报!
离线nmiirq

只看该作者 15楼 发表于: 2008-08-20
OK,十分感谢这个好帖啊~
离线konyka
只看该作者 16楼 发表于: 2009-02-24
做个记号 记下了
离线jinyu
只看该作者 17楼 发表于: 2009-04-26
版主你好,关于第一步是什么意思,如何做呢 数据库和表以及表里的字符相关字段(varchar, char, text等)都要使用gbk_chinese_ci这种方式 如何设置让其使用gbk_chinese_ci呢
离线jinyu
只看该作者 18楼 发表于: 2009-05-08
能给我发下编译生成的支持中文的那个插件吗?谢谢,call.jinyu@yahoo.com.cn
离线aichibanli
只看该作者 19楼 发表于: 2010-01-21
老大,问一下,我是用ODBC连的,也出现乱码,要如何做,我照上面说的加的db.exec("SET NAMES 'GBK'");
不行,请问QODBC时要如何解决中文乱码问题?
离线mylearnhappy
只看该作者 20楼 发表于: 2011-03-10
我试过了,还是不行,估计是MYSQL在安装的时候编码没改成GB2312
离线mylearnhappy
只看该作者 21楼 发表于: 2011-03-12
回 2楼(XChinux) 的帖子
db.exec("SET NAMES 'GBK'");这句话怎么执行不了,我的中文显示还是乱码
离线mylearnhappy
只看该作者 22楼 发表于: 2011-03-12
我在mysql里面用set names gbk;就可以解决显示问题,但是db.exec("SET NAMES 'GBK'");的确执行不了
快速回复
限100 字节
 
上一个 下一个