QT操作SQLITE数据库 插入中文字符乱码的问题

在学习QT的过程中,在sqlite数据库中插入中文乱码的问题,用下面方法最简单有效,即 QString::fromLocal8Bit,就可以解决现实乱码的问题。

qt fromLocal8Bit()函数可以设置编码。

QT默认的编码是unicode,不能显示中文的
windows默认使用(GBK/GB2312/GB18030)
使用fromLocal8Bit()函数,实现了从本地字符集GB到Unicode的转换,用于处理汉语显示乱码等问题

static inline QString fromLocal8Bit(const QByteArray &str);该函数返回的是String类型的数

query.exec( QString::fromLocal8Bit (“insert into automobile values( 2, ‘四轮’,’轿车’,’富康’,rand() % 100 ,123,123,123,123,123)”)); 75

#include <qtwidgets qapplication>
  2 #include <qtcore>
  3 #include <qtextcodec>
  4 #include <qsqldatabase>
  5 #include <qmessagebox>
  6 #include <qsqlquery>
  7 #include <qtime>
  8 #include <qsqlerror>
  9 #include <qsqldriver>
 10 #include <qsqlrecord>
 11 #include <qtdebug>
 12
 13
 14 int main(int argc, char *argv[])
 15 {
 16     QApplication a(argc, argv);
 17
 18     QFile::remove("qtDB.db");    //it's very necessary to testing many times!

 19
 20     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
 21     db.setHostName("easybook-3313b0");          //&#x8BBE;&#x7F6E;&#x6570;&#x636E;&#x5E93;&#x4E3B;&#x673A;&#x540D;
 22     db.setDatabaseName("qtDB.db");              //&#x8BBE;&#x7F6E;&#x6570;&#x636E;&#x5E93;&#x540D;,setHostName/setDatabaseName/setUserName/setPassword&#x662F;&#x975E;&#x5FC5;&#x987B;&#x7684;
 23     //&#x56E0;&#x4E3A;&#x5728;Qt&#x4E2D;&#xFF0C;&#x7531;&#x4E8E;QSQLITE&#x6570;&#x636E;&#x5E93;&#x9A71;&#x52A8;&#x5BF9;&#x5E94;&#x7684;SQLite&#x6570;&#x636E;&#x5E93;&#x662F;&#x4E00;&#x79CD;&#x8FDB;&#x7A0B;&#x5185;&#x7684;&#x672C;&#x5730;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x65E0;&#x9700;&#x6570;&#x636E;&#x5E93;&#x540D;&#x3001;&#x7528;&#x6237;&#x540D;&#x3001;&#x5BC6;&#x7801;&#x3001;&#x4E3B;&#x673A;&#x540D;&#x548C;&#x7AEF;&#x53E3;&#x7B49;&#x7279;&#x6027;
 24     db.setUserName("zhouhejun");                //&#x8BBE;&#x7F6E;&#x6570;&#x636E;&#x5E93;&#x7528;&#x6237;&#x540D;
 25     db.setPassword("123456");                   //&#x8BBE;&#x7F6E;&#x6570;&#x636E;&#x5E93;&#x5BC6;&#x7801;
 26     db.open();                                     //&#x6253;&#x5F00;&#x8FDE;&#x63A5;
 27
 28     //&#x521B;&#x5EFA;&#x6570;&#x636E;&#x5E93;&#x8868;automobile1------&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x591A;&#x4E2A;&#x4E92;&#x4E0D;&#x91CD;&#x540D;&#x7684;&#x6570;&#x636E;&#x5E93;&#x8868;
 29     QSqlQuery query1;
 30     bool success1 = query1.exec("create table automobile1(id int primary key,attribute varchar(100),type varchar(100),kind varchar(100),nation int,carnumber int,elevaltor int,distance int,oil int,temperature int)");
 31
 32     if (success1)
 33         qDebug() <<"create 0 1 2 3 4 5 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 automobile1 successful"; else qdebug() <<"create automobiles1 fail"; 创建数据库表automobile qsqlquery query; bool success="query.exec("create" table automobile(id int primary key,attribute varchar(100),type varchar(100),kind varchar(100),nation int,carnumber int,elevaltor int,distance int,oil int,temperature int)"); if (success) << "create automobile automobiles 查询 query.exec("select * from automobile"); qsqlrecord rec="query.record();" "automobile records' num:" rec.count(); 插入记录 qtime t; t.start(); 像这种带有string类型的table,进行插入元组时,应带有qstring::fromlocal8bit("insert into...")才能保证正确显示. 元组0中因为没有加qstring::fromlocal8bit(...),所以string类型显示不全或乱码 into values( 0, '四轮','轿车','富康',123,123,123,123,123,123)")); (!success) { qsqlerror lasterror="query.lastError();" lasterror.drivertext() "insert row failed"; } 元组1中的string类型均可显示成功 值得注意的是,如果直接使用这种query.exec(...)进行插入元组时,里面所有的列元素必须是确定的,可以带有计算,但不能带入函数 1, '四轮','轿车','富康',(6+6)*12 3,123,123,123,123,123)")); 元组2插入失败 2, '四轮','轿车','富康',rand() % ,123,123,123,123,123)")); 如果直接使用这种query.exec(...)进行插入元组时,id nation等int类型的数据,则必须是具体已确定的数值,而不能用变量进行替代; 元组3插入失败 fourthrowid="3;" values(fourthrowid, 同上,元组4插入失败 thirdrownation="rand()" 100; 4, '四轮','轿车','富康',thirdrownation,123,123,123,123,123)")); 另外一种query.exec();可以通过query.prepare()进行预插值,然后通过query.bindvalue(...)进行数据绑定, 这种方式更加随性一些,因为插入元组的列元素可以是变量,也可以是符合条件的函数 query.prepare(qstring::fromlocal8bit("insert values(?,?,?,?,?,?,?,?,?,?)")); records1="10;" for (int i="0;" < records1; i++) query.bindvalue(0, i+5); ok, 可以正确显示 query.bindvalue(1, "四轮"); 完全显示不出来 query.bindvalue(2, qstring::fromlocal8bit("轿车")); ok,可以正确显示 query.bindvalue(3, '富康'); 单引号,可以显示,但是显示错误 query.bindvalue(4, (6+8)*12 4); 显示42,ok,可以正确显示 query.bindvalue(5, rand() 10000); query.bindvalue(6, 300); query.bindvalue(7, 200000); query.bindvalue(8, 52); query.bindvalue(9, 100); " + "failed"; "first insert records, time:" t.elapsed() ms"; values(?,?,?,?,?,?,?,?,?,?)"))中的qstring::fromlocal8bit在此没有作用,可以不加 query.prepare(("insert long records2="10;" records2; 5); qstring::fromlocal8bit("四轮")); qstring::fromlocal8bit("富康")); 结合以上可以看出,在当前环境下,使用字符串显示中文,需在中文字符的外面加上qstring::fromlocal8bit row" "second db.close(); return a.exec(); }< code></"create></qtdebug></qsqlrecord></qsqldriver></qsqlerror></qtime></qsqlquery></qmessagebox></qsqldatabase></qtextcodec></qtcore></qtwidgets>

Original: https://blog.csdn.net/dhl11/article/details/114664929
Author: 都是木头
Title: QT操作SQLITE数据库 插入中文字符乱码的问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817230/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球