我按照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;
}
而手册上说一般不会出现的.--中的内容来自手册
------------------------------------------------------------------------------------
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;
}
解决方案 »
- 紧急!紧急!mysql 查询失败很多是怎么回事?
- mysql 支持 两台服务器的链表查下吗
- mysql 怎么显示存储过程列表
- 8G内存,myisam存储引擎的系统参数配置,大家给予点意见!
- T-SQL存储过程的return语句和MySQL的存储过程
- 如何往数据表中插入空值?
- mysql函数 加分100
- 为什么看不到自己建立的数据库?
- 怎么删除这个记录!!
- 远程或者本地连接MySQL时报错1130 host is not allowed to connect to this mysql server
- 如何处理网上商城的订单系统中的订单锁定和解锁?
- com.mysql.jdbc.CommunicationsException: Communications link failure
改了都不能编译..如何我用如下代码来取值..
运行正常..但是取到的都为空.
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));
int rows = mysql_stmt_num_rows(stmt);
数据行数的读取都正确了..
但就是数据读不出来..
用 mysql_stmt_store_result + mysql_stmt_fetch
或者用
mysql_store_result + mysql_fetch_row
都读不出来..
用 mysql_query 来读取是可以的.
在这之前,
my_bool true_value= 1;
o->mysql_stmt_attr_set(stmt_, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &true_value); 然后再按你原来的逻辑试试,䚱应该不会截短。
我是Windows7(64) ..Mysql(64)
静侯佳音。我目前在32位机器上还没碰到这个问题。
我换了一台机子.Windows7(32位的)..同样的代码..运行就没有问题...
outBind[1].buffer_length= 5000;
这一句错了, 你的varchar为31 最长也就31了 这里应该改为31 肯定就没问题了