我按照mysql参考手册上的例子做的东东..为什么老是出现数据截断问题..
而手册上说一般不会出现的.--中的内容来自手册
------------------------------------------------------------------------------------
MYSQL_DATA_TRUNCATED
 出现数据截短。
不返回MYSQL_DATA_TRUNCATED,除非用mysql_options()启用了截短通报功能。返回该值时,为了确定截短的参数是哪个,可检查MYSQL_BIND参数结构的错误成员。
---------------------------------------------------------------------------
SQL代码:--创建表
CREATE TABLE userinfo
(
   userid     int,
   username   varchar(31)
);
--------------------------------------
INSERT INTO test.userinfo
(userid, username) 
VALUES (1, '张三');INSERT INTO test.userinfo
(userid, username) 
VALUES (2, '李四');INSERT INTO test.userinfo
(userid, username) 
VALUES (3, '王王');----------------------------------------------------------------
c++代码:
#include <windows.h>
#include <iostream>
#include <string>
#include "mysql.h"          //在工程设置中,包含在mysql的sdk中的include文件夹下using namespace std;string host = "localhost";  //登陆mysql使用的主机名
string user = "root";       //登陆用户
string pwd = "sa";          //填写自己数据库密码
string dbname = "test";     //您要登陆的数据库名
unsigned int port = 3306;   //数据库端口,默认为3306,也可以填写你自己制定的端口string sql = "select * from userinfo";       //sql语句,下面使用接口在c语言中执行该语句
string sqlProcess = "call getUserArea2(3)";  //sql存储过程语句
int status;                 //数据库执行返回的状态,sql语句执行成功返回0int main()
{
    MYSQL *mysql;
    mysql = mysql_init(0);  //接口,初始化
    MYSQL_RES *result;
    MYSQL_ROW row;    //返回数据行
    unsigned long length[2];
    int           row_count;
    int           int_data;
    char          str_data[5000];
    my_bool       is_null[2];    //连接数据库
    if (mysql_real_connect(mysql, host.c_str(), user.c_str(), pwd.c_str(), dbname.c_str(), port, NULL,  CLIENT_FOUND_ROWS | CLIENT_MULTI_STATEMENTS) == NULL)
    {
        cout << "connect failure!" << endl;
        return 0;
    }
    else
    {
        cout << "connect success!" << endl;
    }
    mysql_set_character_set(mysql, "gbk");
    
    //使用预处理
    char sql[] = "select userid,username from userinfo where userid!=(?)"; //"call getUserArea(?)"; //
    
    MYSQL_STMT *stmt = mysql_stmt_init(mysql);
    if (mysql_stmt_prepare(stmt, sql, strlen(sql)))
    {
        printf(mysql_stmt_error(stmt));
        return 0;
    }
    int param_count = mysql_stmt_param_count(stmt);
    
    int t1 =  1;
    MYSQL_BIND inBind;
    memset(&inBind, 0, sizeof(inBind));
    inBind.buffer_type = MYSQL_TYPE_LONG;
    inBind.buffer = (char *)&t1;
    inBind.is_null = 0;
    inBind.length = 0;
    
    if (mysql_stmt_bind_param(stmt, &inBind))
    {
        printf(mysql_stmt_error(stmt));
        return 0;
    }    if (mysql_stmt_execute(stmt))
    {
        printf(mysql_stmt_error(stmt));      
    }    MYSQL_BIND outBind[2];
    memset(outBind, 0, sizeof(outBind));
    //INTEGER COLUMN
    outBind[0].buffer_type = MYSQL_TYPE_LONG;
    outBind[0].buffer= (char *)&int_data;
    outBind[0].is_null= &is_null[0];
    outBind[0].length= &length[0]; 
    //STRING COLUMN 
    outBind[1].buffer_type= MYSQL_TYPE_STRING;
    outBind[1].buffer= (char *)str_data;
    outBind[1].buffer_length= 5000;
    outBind[1].is_null= &is_null[1];
    outBind[1].length= &length[1];
    if (mysql_stmt_bind_result(stmt, outBind))
    { 
        fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
        exit(0);
    }
    /* Now buffer all results to client */
    if (mysql_stmt_store_result(stmt))
    { 
        fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  
        exit(0);
    }       int rows = mysql_stmt_num_rows(stmt);
    for( my_ulonglong i=0; i<rows; ++i )
    {
        int r = mysql_stmt_fetch(stmt); 
//出现数据截断。就是这里出错的....
        if(r == MYSQL_DATA_TRUNCATED)         {
            fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); 
        }        fprintf(stdout, "column1: "); 
        if (is_null[0])    fprintf(stdout, " NULL\n");
        else    fprintf(stdout, " %d(%ld)\n", int_data, length[0]);         /* column 2 */  
        fprintf(stdout, "column2:");  
        if (is_null[1])    fprintf(stdout, " NULL\n");  
        else    fprintf(stdout, " %s(%ld)\n", str_data, length[1]); 
    }    mysql_stmt_close(stmt);
    return 0;
}

解决方案 »

  1.   

    把mysql_store_result改为mysql_store_result(&mysql)
      

  2.   

    不行啊.我这里的MYSQL_STMT *stmt 本来声明的就是指针..
    改了都不能编译..如何我用如下代码来取值..
    运行正常..但是取到的都为空.
        do
        {
            if (result = mysql_store_result(mysql))
            {
                //显示结果
                while (row = mysql_fetch_row(result))
                {
                    cout << row[0] << "|" << row[1] << endl;
                }
                //process_result_set(result);
                mysql_free_result(result);
            }
        }
        while (!mysql_next_result(mysql));
      

  3.   

    问题在于这里..
     int rows = mysql_stmt_num_rows(stmt);
    数据行数的读取都正确了..
    但就是数据读不出来..
    用 mysql_stmt_store_result + mysql_stmt_fetch
    或者用 
    mysql_store_result + mysql_fetch_row 
    都读不出来..
      

  4.   

    因为是用 mysql_stmt_execute 才出现这个问题的..
    用 mysql_query 来读取是可以的.
      

  5.   

    可能要启用一个关键的标识,才能用mysql_stmt_store_result
    在这之前,
        my_bool true_value= 1;
    o->mysql_stmt_attr_set(stmt_, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &true_value); 然后再按你原来的逻辑试试,䚱应该不会截短。
      

  6.   

    设置了还是没有用..应该不是截断的问题.我改为查询出来只有整型还是这个错误..应该是跟环境有关..
    我是Windows7(64) ..Mysql(64) 
      

  7.   

    如果实在不行,可以上mysql网站上试着提交一个bug,把重现步骤描述清楚,这样很快就能得到回复。
    静侯佳音。我目前在32位机器上还没碰到这个问题。
      

  8.   

    还真的跟环境有关...
    我换了一台机子.Windows7(32位的)..同样的代码..运行就没有问题...
      

  9.   


    outBind[1].buffer_length= 5000;
    这一句错了, 你的varchar为31  最长也就31了  这里应该改为31  肯定就没问题了