Hi,
Using server version: 11.2.2, I try to extract data from a database with
this C-code:
#include
#include
#include
#include
define MAXFLEN 66
char *bo_src = "SELECT FILENAMME, FILENUM FROM BOEK WHERE TOKENS IS
NULL ORDER BY UDC_KOADE, FILENUM";
char filename[MAXFLEN],
stavering[3];
long filenum;
int fetch_result;
MYSQL *bo_src_sql;
MYSQL_ST MT *bo_src_stmt;
MYSQL_RES *bo_src_res;
MYSQL_BIND bo_src_bind[2],
bo_src_bind_result[2];
int main (argc, argv)
int argc;
char *argv[];
{ bo_src_sql = mysql_init(bo_src_sql)
; if ((bo_src_stmt = mysql_stmt_init(bo_src_sql))==NULL)
printf ("Can't initialize %s:\n %s/n", bo_src,
mysql_error(bo_src_sql))
; if
(!mysql_real_connect(bo_src_sql,"localhost","<user>","<passwd>","tdb",0,NULL,0))
fprintf(stderr, "Failed to connect to book table for
select: Error: %s\n", mysql_error(bo_src_sql))
; if (mysql_stmt_prepare(bo_src_stmt, bo_src, strlen(bo_src)))
printf ("Can't prepare %s:\n %s\n", bo_src,
mysql_error(bo_src_sql))
; bo_src_bind_result[0].buffer_type = MYSQL_TYPE_STRING
; bo_src_bind_result[0].buffer = filename
; bo_src_bind_result[0].buffer_length = 100
; bo_src_bind_result[1].buffer_type = MYSQL_TYPE_LONG
; bo_src_bind_result[1].buffer = (long *)&filenum
; bo_src_bind_result[1].buffer_length = sizeof (filenum)
; memset (bo_src_bind, 0, sizeof (bo_src_bind))
; memset (bo_src_bind_result, 0, sizeof (bo_src_bind_result))
; if (mysql_stmt_bind_param (bo_src_stmt, bo_src_bind))
fprintf(stderr, "Failed to bind parameters in %s: \n Error:
%s\n", bo_src, mysql_error(bo_src_sql))
; if (mysql_stmt_bind_result(bo_src_stmt, bo_src_bind_result))
fprintf(stderr, "Failed to bind result in %s: \n Error:
%s\n", bo_src, mysql_error(bo_src_sql))
; if (!mysql_stmt_execute (bo_src_stmt))
{ fetch_result = mysql_stmt_fetch(bo_src_stmt)
; if (fetch_result == 0)
printf ("%ld %s %s\n", filenum, filename, stavering)
; else if (fetch_result == MYSQL_NO_DATA)
printf ("No data found\n")
; else if (fetch_result == MYSQL_DATA_TRUNCATED)
printf ("Data truncated.\n%d/n", fetch_result)
; else printf ("Something else! %d \n%s/n",
fetch_result, mysql_error(bo_src_sql));
}
; mysql_stmt_close(bo_src_stmt)
; mysql_close(bo_src_sql);
}
The definition of the table is
describe BOEK;
+-----------+-------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default |
Extra |
+-----------+-------------------------------+------+-----+---------+----------------+
| FILENUM | smallint(4) | NO | PRI | NULL |
auto_increment |
| TITEL | varchar(50) | YES | | NULL |
|
| UDC_KOADE | varchar(10) | YES | | NULL |
|
| ISBN | bigint(13) | YES | | NULL |
|
| FILENAMME | varchar(20) | YES | | NULL |
|
| SKR_NUM | smallint(5) | YES | | NULL |
|
| UTJ_NUM | smallint(5) | YES | | NULL |
|
| UTJ_DATUM | date | YES | | NULL |
|
| OERSET | tinyint(1) | YES | | NULL |
|
| PRINTINGE | smallint(3) | YES | | NULL |
|
| YNL_DATUM | date | YES | | NULL |
|
| STAVERING | enum('ald','mid','nij','int') | YES | | NULL |
|
| TOKENS | smallint(6) | YES | | NULL |
|
| TYPES | smallint(5) | YES | | NULL |
|
| MAXTOKENS | smallint(6) | YES | | NULL |
|
| MAXTYPES | smallint(5) | YES | | NULL |
|
| TIID | time | YES | | NULL |
|
+-----------+-------------------------------+------+-----+---------+----------------+
So the size of FILENAMME, varchar20, is much smaller than the buffer
length specified in the code:
; bo_src_bind_result[0].buffer_type = MYSQL_TYPE_STRING
; bo_src_bind_result[0].buffer = filename
; bo_src_bind_result[0].buffer_length = 100
Yet I get a MYSQL_DATA_TRUNCATED fetching the result of the query.
Debugging, only the integer filenum gets its value.
The statement (SELECT FILENAMME, FILENUM FROM BOEK WHERE TOKENS IS NULL
ORDER BY UDC_KOADE, FILENUM;) gives the expected result when entered in
a terminal session.
I obviously do something wrong, but I can't find out what. Googling gets
me no answer.
Anyone who can spot the error?
Many thanks in advance,
best regards, Jogchum