环境:
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天了,求大神指教!
感谢大家的回复!
已经找到解决办法了,问题出在了QT的ODBC驱动上。
需要手动修改QT源码的odbc目录下的qsql_odbc.cpp文件。
将unicode修改为true。
(其实现在看到源码也挺迷惑的,qt默认在Unicode=false的情况下,处理QString是用的str.toUtf8(),但是这种方式反而不能正确写入中文)
sqlserver在 linux下的编码问题
我刚开始也是怀疑这个,但是直接插入"insert into t (is,name) values(1,'中文')"是没问题的啊。
很棒的回答。
式式这样
query.bindValue(0,QString::fromUtf8("中文"));
query.prepare("insert into t (is,name) values(?,?)";
query.bindValue(0,1);
query.bindValue(1,"中文"); ----》这里下标错了吧。
试过了,不行的。
@alasoft:
query.prepare("insert into t (is,name) values(:is,:name)";
query.bindValue(“:is",1);
query.bindValue(":name","中文");
@为乐而来: 2种方式都试过的...
我已经卡在这里好几天了。。。
相同的代码sqlite是可以的。
所以我怀疑问题出在freeTDS或者qt的ODBC驱动上。