首页 新闻 搜索 专区 学院

QT插入数据库中文异常

0
悬赏园豆:100 [已解决问题] 解决于 2021-09-15 10:36

环境:
linux
QT5
unixODBC
freeTDS
SQL Server 2008

1、QSqlQuery直接执行sql没问题
如:QString sql = "insert into t (is,name) values(1,'中文')";
可以正常插入id和name

2、使用bindValue
query.prepare("insert into t (is,name) values(?,?)";
query.bindValue(0,1);
query.bindValue(0,"中文");
id可以插入,name为空(name如果不是中文可以正常插入)
(相同的代码在windows环境可以正常插入中文)
【希望解决该问题】

3、如果连接的不是sql server而是sqlite,情况2的代码可以正常插入。

分析:
情况1说明unixODBC和freeTDS是没问题的,可以插入中文。
情况3说明qt的编码是没问题的。

困扰我2天了,求大神指教!

alasoft的主页 alasoft | 初学一级 | 园豆:118
提问于:2021-09-14 17:46
< >
分享
最佳答案
0

感谢大家的回复!
已经找到解决办法了,问题出在了QT的ODBC驱动上。
需要手动修改QT源码的odbc目录下的qsql_odbc.cpp文件。
将unicode修改为true。
(其实现在看到源码也挺迷惑的,qt默认在Unicode=false的情况下,处理QString是用的str.toUtf8(),但是这种方式反而不能正确写入中文)

alasoft | 初学一级 |园豆:118 | 2021-09-15 10:21
其他回答(2)
0

sqlserver在 linux下的编码问题

收获园豆:40
不知道风往哪儿吹 | 园豆:1818 (小虾三级) | 2021-09-14 17:55

我刚开始也是怀疑这个,但是直接插入"insert into t (is,name) values(1,'中文')"是没问题的啊。

支持(0) 反对(0) alasoft | 园豆:118 (初学一级) | 2021-09-14 17:57

很棒的回答。

支持(0) 反对(0) 取次回顾 | 园豆:210 (菜鸟二级) | 2021-09-14 20:03
0

式式这样
query.bindValue(0,QString::fromUtf8("中文"));

收获园豆:60
为乐而来 | 园豆:1331 (小虾三级) | 2021-09-15 09:47

query.prepare("insert into t (is,name) values(?,?)";
query.bindValue(0,1);
query.bindValue(1,"中文"); ----》这里下标错了吧。

支持(0) 反对(0) 为乐而来 | 园豆:1331 (小虾三级) | 2021-09-15 09:48

试过了,不行的。

支持(0) 反对(0) alasoft | 园豆:118 (初学一级) | 2021-09-15 09:48

@alasoft:

query.prepare("insert into t (is,name) values(:is,:name)";
query.bindValue(“:is",1);
query.bindValue(":name","中文");

支持(0) 反对(0) 为乐而来 | 园豆:1331 (小虾三级) | 2021-09-15 09:56

@为乐而来: 2种方式都试过的...
我已经卡在这里好几天了。。。
相同的代码sqlite是可以的。
所以我怀疑问题出在freeTDS或者qt的ODBC驱动上。

支持(0) 反对(0) alasoft | 园豆:118 (初学一级) | 2021-09-15 09:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册