详解QT 中连接Mysql 乱码解决方法
创始人
2024-08-02 13:40:36
0

QT 中连接Mysql 乱码解决方法是本文介绍的内容,QT连接mysql之后出现乱码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函数,注意红色加粗部分,是我修改增加的语句。

  1. tatic QTextCodec* codec(MYSQL* mysql)   
  2. {   
  3. return QTextCodec::codecForName("GBK");   
  4. #if MYSQL_VERSION_ID >= 32321   
  5. QTextCodec* heuristicCodec = QTextCodec::codecForName(mysql_character_set_name(mysql));   
  6. if (heuristicCodec)   
  7. return heuristicCodec;   
  8. #endif   
  9. return QTextCodec::codecForLocale();   
  10. }  

然后,重新编译qt的mysql驱动,这里就不多说了,请查看Qt相关文档

三、在Qt程序main函数中app后面开头处加入下面两句,加上这两个是省得不必要的麻烦。

  1. QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));   
  2. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));   
  3. //QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));  

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

  1. db = QSqlDatabase::addDatabase("QMYSQL");   
  2. db.setHostName("localhost");   
  3. db.setDatabaseName("yourdatabase");   
  4. db.setUserName("yourusername");   
  5. db.setPassword("yourpassword");   
  6. db.open();   
  7. db.exec("SET NAMES 'GBK'");  

OK, 走过上面四步以后,我们就可以在程序中正确使用查看MySQL中的中文数据了。

但是如果你要直接通过SQL语句修改数据,则需要正确的把输入的内容转变为GB码中,比如:

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

值得注意的是,如果在第三步中把第三行的codecForTr的注释去掉,则就不用上面的字符串格式转换了。

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

如果数据库中的编码使用的是UTF8,则把上面相关的部分改为UTF-8(Qt)或者UTF8(MySQL)就行了。

小结:关于详解QT 中连接Mysql 乱码解决方法的内容介绍完了,更多Mysql的内容,请参考编辑推荐,***希望本文对你有所帮助!

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...