• 7987阅读
  • 4回复

[提问]Qt3使用MySQL插入中文问题!急问! [复制链接]

上一主题 下一主题
离线kevin613
 

只看楼主 倒序阅读 楼主  发表于: 2007-05-22
Qt3使用MySQL插入中文问题!急问!
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
使用的是Qt3,MySQL4.1.22
按照置顶贴把环境都已经设置好,能够正确显示中文,并能够在终端中使用mysql插入中文。程序如下:
#include <qapplication.h>
#include <qsqldatabase.h>
#include <qtextcodec.h>
#include "testdb.h"
#include <qcstring.h>
#include <qmessagebox.h>

int main( int argc, char ** argv )
{
    QApplication a( argc, argv );
    QTextCodec* codec = QTextCodec::codecForName("GBK");
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
   
    QSqlDatabase *defaultDB = QSqlDatabase::addDatabase("QMYSQL3");
    defaultDB->setDatabaseName("kevin");
    defaultDB->setHostName("localhost");
    defaultDB->setUserName("");
    defaultDB->setPassword("");
    defaultDB->open();

    defaultDB->exec("SET NAMES 'GBK'");
 
    QSqlQuery *query = new QSqlQuery(defaultDB);   
    QCString SQL_string = codec->fromUnicode("张三丰");   
    QMessageBox::information( 0, "Application name",
            SQL_string );

  query->exec("INSERT kevin.stu values(15,'"+SQL_string+"','25');");

   
    testDB w;
    w.show();
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
    return a.exec();
}

问题是能够插入两个或两个以下的汉字,三个及以上就不能够插入。
当SQL_string设成QString类型时,就只能插入一个汉字。。。。
困扰很久了。
希望各位和版主能够帮忙解决一下。谢谢。
[ 此贴被kevin613在2007-05-22 20:52重新编辑 ]
离线kevin613

只看该作者 1楼 发表于: 2007-05-24
没有人知道吗?哎。。。
离线hehui

只看该作者 2楼 发表于: 2007-06-06
我的程序表名不能为汉字,内容可以!!!

直接用SQL查询没任何问题!

郁闷!!!!!!!!!!
离线hatoyu

只看该作者 3楼 发表于: 2008-06-04
我也一样  不过是QT4
离线netboy168

只看该作者 4楼 发表于: 2008-07-30
我们也碰到类似问题,经调试发现是QT对中文长度计算方式不一样造成的,修改D:\Qt\3.3.4\src\sql\drivers\mysql\qsql_mysql.cpp 中292 行 reset 函数,修改为以下形式就可以了
    int nSqlLen = strlen(query.ascii());

    if ( !driver() )
    return FALSE;
    if ( !driver()-> isOpen() || driver()->isOpenError() )
    return FALSE;
    cleanup();
    if ( mysql_real_query( d->mysql, query.ascii(), nSqlLen ) ) {
    setLastError( qMakeError("Unable to execute query", QSqlError::Statement, d ) );
    return FALSE;
    }
    if ( isForwardOnly() ) {
    if ( isActive() || isValid() ) // have to empty the results from previous query
       fetchLast();
    d->result = mysql_use_result( d->mysql );
    } else {
    d->result = mysql_store_result( d->mysql );
    }
    if ( !d->result && mysql_field_count( d->mysql ) > 0 ) {
    setLastError( qMakeError( "Unable to store result", QSqlError::Statement, d ) );
    return FALSE;
    }
    int numFields = mysql_field_count( d->mysql );
    setSelect( !( numFields == 0) );
    d->fieldTypes.resize( numFields );
    if ( isSelect() ) {
    for( int i = 0; i < numFields; i++) {
       MYSQL_FIELD* field = mysql_fetch_field_direct( d->result, i );
       if ( field->type == FIELD_TYPE_DECIMAL )
        d->fieldTypes = QVariant::String;
       else
        d->fieldTypes = qDecodeMYSQLType( field->type, field->flags );
    }
    }
    setActive( TRUE );
    return TRUE;

重新编译生成qsqlmysql.dll,中文问题得到解决,使用测试例子就是楼主的例子.
快速回复
限100 字节
 
上一个 下一个