Hi,
Using server version: 11.2.2, I try to extract data from a database with this C-code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mysql.h>
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