• 7755阅读
  • 3回复

[提问](中文)同样是通过输入汉字来查询mysql数据库中的类容问题 [复制链接]

上一主题 下一主题
离线xiaobaiwen
 
只看楼主 倒序阅读 楼主  发表于: 2008-11-12
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
这个问题在论坛里的帖子应该是最多的咯! 今天从下午搜到现在,结果还是搞不定,
首先还是要问下Xchiunx 你的置顶帖 那个写解决Qt4 mysql中文问题帖子还有效吗??
我用你的方法就是搞不定,以下是我自己碰出来的解决方法,我也不懂什么原理,反正就是碰出来的
不过,你那个帖子好像也太老咯
我的环境是win+Qt4.4.3+mysql5.0.18

现在解决了两个问题:1 在Qt界面中显示中文方法是:
        main中加QTextCodec::setCodecForTr(QTextCodec::codecForLocale("GBK")); 然后把源码中的中文都加tr();
                      问题:2在select语句中含有中文如下面一句:
          query.prepare("select * from student  where sname = '李四'");
解决办法是在main中添加: 
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(("GBK"));

还有个问题希望大家帮忙看看
          现在问题是我想将lineEdit中读到的类容替换上面的"李四",再查询数据库。不知到如何解决,总是不成功,都搞了好久了,我看了很多旧帖子,还是没成功,应该就是里面提到的内码转换的问题,大家能帮忙看看吗?
好累哦! 靠 !要熄灯了,明天再搞咯!                       
         
离线xiaobaiwen
只看该作者 1楼 发表于: 2008-11-13

置顶帖里说db.exec("SET NAMES 'GBK'"); 这句很重要,结果加上这句,就绝对查询出乱码,
所以我就没加。
问题还是不能输入汉字 来查,输入拼音也不行,只能是输入数字

查询语句我是这样写的:
QString inputString = stuLineEdit->text();
query.prepare("select * from student where sname = "+ inputString);

inputString 是不是应该有什么转换??  怎么转换呢???
置顶帖里说的加上QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));就不用转换,但我这还是不行的
[ 此贴被xiaobaiwen在2008-11-13 08:47重新编辑 ]
离线XChinux

只看该作者 2楼 发表于: 2008-11-13
一、首先MySQL安装的时候要支持UTF-8/GBK,你创建数据表的时候要选择它的字符编码为UTF-8或GBK,一个数据库内要统一,要么用UTF-8,要么用GBK。如果不进行以上选择,很可能就是latin1,那就可能出错(对于MySQL 3.23及其以下版本来说,汉字就是这样输入进去的,升级到MySQL 4/5的时候,如果不进行正确的转换,那在新数据库中你的汉字编码就是latin1,这时候是比较难办的,此种情况下的解决办法。。。。。。没试验过,还是升级成正确的字符集吧)

二、在Qt程序中使用中文,一种方法是源程序个不出现任何中文,全是英文,中文采用.tr/.qm翻译文件的方式来实现。第二种方法是如楼主所述,不使用翻译文件
QTextCodec::setCodecForCStrings(QTextCode::codecForName("GBK"));   这句话指明代码中直接写GBK中文字符串(也就是源文件的编码是GBK)
QTextCodec::setCodecForCStrings(QTextCode::codecForName("UTF-8"));  这句话指明代码中直接写UTF-8中文字符串(也就是源文件编码是UTF-8)

但是有如下情况:
1、如果编译器为mingw/gcc,则采用GBK或UTF-8都行,但采用UTF-8的前提条件是源文件保存时没有加BOM信息,也就是源文件开头没有三个特殊字节。使用vim的话,要如下保存
:set nobomb
:set fenc=utf-8
2、如果编译器为MSVC的话,则采用GBK或UTF-8也都行,但采用UTF-8的前提条件是源文件保存时加了BOM信息,同理,如采用vim的话,要如下保存
:set bomb
:set fenc=utf-8

由上可见,如果在源程序中直接使用中文,则只能采用GBK编码方能mingw/gcc/msvc都通过。为求取兼容性,最好的方法是采用翻译文件,至于注释,如果有中文注释,则只能保存成GBK了。

三、在Qt程序中进行MySQL查询。首先MySQL必须支持多字符集(GBK、UTF-8),其次要在连接上MySQL后执行set NAMES 'utf8'或者set NAMES 'gbk',要看你的源程序中使用什么编码,因为Qt内部是使用unicode的。对于其它程序,比如PHP程序,如果里面采用的是GBK,则在连接MySQL后执行set NAMES 'gbk'。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线xiaobaiwen
只看该作者 3楼 发表于: 2008-11-13
引用第2楼XChinux于2008-11-13 09:32发表的  :
一、首先MySQL安装的时候要支持UTF-8/GBK,你创建数据表的时候要选择它的字符编码为UTF-8或GBK,一个数据库内要统一,要么用UTF-8,要么用GBK。如果不进行以上选择,很可能就是latin1,那就可能出错(对于MySQL 3.23及其以下版本来说,汉字就是这样输入进去的,升级到MySQL 4/5的时候,如果不进行正确的转换,那在新数据库中你的汉字编码就是latin1,这时候是比较难办的,此种情况下的解决办法。。。。。。没试验过,还是升级成正确的字符集吧)
二、在Qt程序中使用中文,一种方法是源程序个不出现任何中文,全是英文,中文采用.tr/.qm翻译文件的方式来实现。第二种方法是如楼主所述,不使用翻译文件
QTextCodec::setCodecForCStrings(QTextCode::codecForName("GBK"));  这句话指明代码中直接写GBK中文字符串(也就是源文件的编码是GBK)
QTextCodec::setCodecForCStrings(QTextCode::codecForName("UTF-8"));  这句话指明代码中直接写UTF-8中文字符串(也就是源文件编码是UTF-8)
.......



xchinux 实在不好意思,我瞎了眼,上面那句应该这样写
query.prepare("select * from student where sname = '"+ inputString+"'");

少了两个单引号,刚才上课的时候自己突然想起来的,回来一试,就好了前几天也犯过同样的错 这会还害你写这么多。不过还是要感谢你,写这么多,我也明白了些道理
谢谢你啦!!
快速回复
限100 字节
 
上一个 下一个