• 5960阅读
  • 28回复

[讨论]中文 无法查询 [复制链接]

上一主题 下一主题
离线tklinuz
 

只看楼主 倒序阅读 楼主  发表于: 2013-04-12
x.exec("select * from table where city='上海' "); 无法查询到想要的记录。
x.exec("select * from table where name=‘ABC’ ");  这样能查询到想要的记录。
请问这是什么原因?数据问题的,这两条语句在sql server 2008里都能查询,在Qt里怎么就不行呢?
软件工程。。专收各种调剂生。。。
离线XChinux

只看该作者 1楼 发表于: 2013-04-12
Qt4 ? Qt5 ?
与你的编码有关系.
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线tklinuz

只看该作者 2楼 发表于: 2013-04-12
Qt4.8.4  Win7  不只是where语句,其他像insert into ,只要涉及中文都不成功。。。我跪了
软件工程。。专收各种调剂生。。。
离线wj025
只看该作者 3楼 发表于: 2013-04-12
你可以DEBUG起来,看一下where在内存中是怎样的。
或者用qDebug()输出一下where,看显示正常嘛?
我前几天也碰到过类似问题。我的经验是:
20130410
1、QT源码中包含中文的处理(不考虑图际化,如果国际化建议源码中不使用中文)
(1)源码保存成带BOM的UTF8。(即源码界面右击,选菜单“保存时添加UTF-8 BOM)
(2)源码文件开头加:#pragma execution_character_set("utf-8")
(3)在main中设置字符集为UTF8
        QTextCodec* pCodec = QTextCodec::codecForName("UTF-8");//("GB18030-0");
    QTextCodec::setCodecForLocale(pCodec);
离线tklinuz

只看该作者 4楼 发表于: 2013-04-12
我就是通过Debug才发现是中文问题的,第(3)条已经加了
按您说的加上#program还是无效,保存为BOM那个我没找到,我用的是Qt creator ,还是谢谢您啦!
软件工程。。专收各种调剂生。。。
离线tklinuz

只看该作者 5楼 发表于: 2013-04-12
找到BOM了。。。还是老样子
软件工程。。专收各种调剂生。。。
离线tklinuz

只看该作者 6楼 发表于: 2013-04-12
对了。。还有x.isValid()返回false   这个函数帮助文档只有一句话,我也没看明白为什么返回false
软件工程。。专收各种调剂生。。。
离线ffii4455

只看该作者 7楼 发表于: 2013-04-12
main函数第一句加上QTextCodec::setCodecForCStrings(QTextCodec::codecForName("system"));  //还有对应头文件

就是中文编码的问题。把你的代码编码改回system



用qmessagebox直接试中文弹窗,不要用tr(),要是不乱码,数据库就没问题。
离线tklinuz

只看该作者 8楼 发表于: 2013-04-12
我只有在sql语句中加中文时才出问题,单纯显示中文没问题。
改回system还是无效。谢谢您的帮助!
软件工程。。专收各种调剂生。。。
离线tklinuz

只看该作者 9楼 发表于: 2013-04-12
我还有一个怪问题,不知道和这个有没有关系,就是在Qt里边执行一条insert into语句,然后sql server 数据库里会多出两条一样的记录,好像执行了两次一样,类似的还有执行一条弹出一个对话框的语句,然后会弹出两个一样的对话框。
软件工程。。专收各种调剂生。。。
离线wj025
只看该作者 10楼 发表于: 2013-04-13
QT我也是初次接触。前几天还碰到位图显示不了的问题,后来版主解答说是要删除DEBUG目录,再生新编译就可以了。
你也可以试试看。
离线tklinuz

只看该作者 11楼 发表于: 2013-04-13
好的,我下午去试试。
软件工程。。专收各种调剂生。。。
离线tklinuz

只看该作者 12楼 发表于: 2013-04-13
删DEBUG目录还是不行。今天改用linux系统,数据库改用mysql,把.h, .cpp文件复制了,再新建工程,还是有这个问题。。。。
软件工程。。专收各种调剂生。。。
离线wj025
只看该作者 13楼 发表于: 2013-04-13
你的工程大不大,要不你将这个不行的功能提取出来,单独做个小工程。
发上来大家一起帮你试试看
离线jeffreylee

只看该作者 14楼 发表于: 2013-04-13
回 楼主(tklinuz) 的帖子
这是因为你的数据库表字段的编码跟你C++字符串的编码不一致造成的,统一设置为utf-8试试
离线tklinuz

只看该作者 15楼 发表于: 2013-04-14
版主说的对,确实是字符集不一致造成的,非常感谢
软件工程。。专收各种调剂生。。。
离线tklinuz

只看该作者 16楼 发表于: 2013-04-14
小工程 small.tar.gz (4 K) 下载次数:5
我把源码的字符集和Mysql的字符集都改为UTF-8,可还是不行
发个小工程,麻烦大家帮我看看,拜托啦,数据库貌似发不了,我就发个代码吧,节省大家时间:
create database ticket;
use ticket;
create table ticketSale(
id varchar(10),
city varchar(10));
insert into ticketSale
values(
'A1','上海');

myui.cpp 里执行 query.exec("SELECT id,city FROM ticketSale where city='上海'");  //不成功
                                query.exec("SELECT id,city FROM ticketSale where id='A1'");   //成功
软件工程。。专收各种调剂生。。。
离线tklinuz

只看该作者 17楼 发表于: 2013-04-14
#pragma execution_character_set('UTF-8'); 这条会被GCC忽略掉,网上查了下,说这条是VC里的,那GCC怎么设置执行字符集呢?
软件工程。。专收各种调剂生。。。
离线wj025
只看该作者 18楼 发表于: 2013-04-14
你的小工程,我编译了下还有错误啊!
我的环境是QT5.0.2
离线wj025
只看该作者 19楼 发表于: 2013-04-14
不知为何,图片插不进来。
错误信息如下:
D:\QtCode\small\small\myui.cpp:3: In file included from ..\small\myui.cpp:3:0:
D:\QtCode\small\small\myui.h:3: 错误:ui_myui.h: No such file or directory
离线tklinuz

只看该作者 20楼 发表于: 2013-04-14
今天又折腾了一天,终于搞定了,
main里需要加3行,我一开始只加了第一行。
QTextCodec::setCodecForTr( QTextCodec::codecForName("UTF8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));

还有就是连接数据库之后加上 x.exec("SET NAMES 'UTF8'"); 这句
就因为这么个问题,拖了一星期。。。
软件工程。。专收各种调剂生。。。
离线tklinuz

只看该作者 21楼 发表于: 2013-04-14
回 3楼(wj025) 的帖子
第(3)条还有个setCodecForCStrings 否则不行。。。
软件工程。。专收各种调剂生。。。
离线tklinuz

只看该作者 22楼 发表于: 2013-04-14
回 18楼(wj025) 的帖子
我是4.8.4,我这编译通过的,可能是版本原因
软件工程。。专收各种调剂生。。。
离线XChinux

只看该作者 23楼 发表于: 2013-04-14
引用第20楼tklinuz于2013-04-14 18:55发表的  :
今天又折腾了一天,终于搞定了,
main里需要加3行,我一开始只加了第一行。
QTextCodec::setCodecForTr( QTextCodec::codecForName("UTF8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));
.......

其实是两个问题,
1. Qt中文问题,分为Qt4和Qt5,处理方法不同(虽然本质是相同的)
2. MySQL编码问题,就是你这里说的set names 'utf8'或者set names 'gbk'(当然,也有其它方法),其实这个在网上一搜就能搜到.
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线向西流
只看该作者 24楼 发表于: 2013-04-21
回 20楼(tklinuz) 的帖子
楼主,我现在也是遇到一样的问题,数据库是中文的,model->setQuery("select * from '膝关节'");
也是没反应,按你上面的加了
QTextCodec::setCodecForTr( QTextCodec::codecForName("UTF8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));
及 db.exec("SET NAMES 'UTF8'");
还是没反应,不知道是否是少了操作
源码保存成带BOM的UTF8。(即源码界面右击,选菜单“保存时添加UTF-8 BOM)
如果是,在哪个位置找呢,能否截几个图看看

离线tklinuz

只看该作者 25楼 发表于: 2013-04-22
回 24楼(向西流) 的帖子
数据库的所有字符集都设置为UTF8了吗?我的是mysql。还有,我没用model,我是这样的: QSqlQuery x(db); x.exec(SET NAMES 'UTF8');
软件工程。。专收各种调剂生。。。
离线tklinuz

只看该作者 26楼 发表于: 2013-04-22
回 25楼(tklinuz) 的帖子
你不用model能成功的话,肯定就是model的问题了,model我没用过,不是很清楚。
软件工程。。专收各种调剂生。。。
离线向西流
只看该作者 27楼 发表于: 2013-04-24
回 25楼(tklinuz) 的帖子
如何将数据库的所有字符集设置成utf8,我用的是access
离线tklinuz

只看该作者 28楼 发表于: 2013-04-25
回 27楼(向西流) 的帖子
access就不清楚了,mysql的话几条命令就搞定了
软件工程。。专收各种调剂生。。。
快速回复
限100 字节
 
上一个 下一个