读书人

linux C mysql的blob门类字段的插入和

发布时间: 2013-02-19 11:11:40 作者: rapoo

linux C mysql的blob类型字段的插入和读取。
RT,没对mysql中的这种类型操作过,还请各位大神帮帮忙,需要一点代码,确实有点急,网上看了一些,但是没怎么看懂。还望指导,多谢!! mysql linux c
[解决办法]
要存取二进制数据。我在VB中用libmysql.dll来操作MySQL,应该说比VC来得来更复杂些。本论坛有讨论,可惜现在论坛搜索功能不稳定,搜索不到。现将收藏的内容贴出。另外,我认为可以将二进制数据进行BASE64编码,转成字符串来操作,问题就简单得多了。

MySQL中的二进制数据的存取
今天看了MySQL的文档,也看了一些网上的文章,了解到了二进制数据在MYSQL中是如何处理的,许多例子是用在图像数据
的存取中,偏偏我要存取的不是图像数据,不过也没有关系,反正都是二进制数据,没有区别.
我现在总结一下在LINUX下如何用C存取二进制数据.

如果是插入二进制数据,你能有如下的步骤:

1,定义一个缓冲区char buf[EB]??(What EB? Enought Big,hehe~~~)

2,把标准的SQL语句用sprintf或strcpy之类的函数填入,直到插入二进制的地方.在下面一步插入二进制.

3,用某种方法读取二进制数据到tmpbuf[SIZE];
? 例如:要插入的是图像文件数据,用fread(tmpbuf, 1, sizeof(tmpbuf), filestream),然后用
mysql_real_escape_string()函数将buf继续填满(注意应在第2步中填入的字串的结束字符'\0'开始填起,即不要
有'\0'),这个函数的原型为:
unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)
其中mysql指针是有效的,已经连接成功的句柄,换句话说mysql必须是成功执行mysql_real_connect()函数返回的句柄.

如果你看到了mysql_escape_string这种函数,那请不要使用它,它已经快被废除了.

4,若还有要插入的数据,继续2,3步.

5,然后加上余下的SQL语言构成完整的SQL语言.

6,最后你可以用mysql_real_query()来执行SQL语言了,其原型如下:
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

注意:有一个要点要注意,因为二进制数据包括了许多的0或\r等等之类的字符,在字符串中有可能被解释成其他的意思,所以我们用了上面mysql_real_escape_string()函数来拷贝数据,所以我们必须有变量能记录查询字串buf[EB]的首尾位置,这样我们才能知道到底查询字串有多长,在最后把该长度传递给mysql_real_query函数的最后一个参数.

如果是查询到二进制的数据,那也很容易,我就随便说几个要点:
1,构造查询字串.
2,执行mysql_real_query查询.
3,用mysql_store_result存储结果.
4,用mysql_fetch_row取出一条记录处理.
如果取出来的是二进制的数据,要确定它的长度,必须要用mysql_fetch_lengths函数取得其长度.



mysql数据库如何存储二进制数据 linux下 C API


用 mysql_stmt_send_long_data()来做
这里是mysql文档的例子,它存储的是text类型。blob类型类似

二进制文件读取,可见
http://www.chinaunix.net/jh/23/312541.html
#define INSERT_QUERY "INSERT INTO test_long_data(text_column) VALUES(?)"

MYSQL_BIND bind[1];
long length;
smtt = mysql_stmt_init(mysql);
if (!stmt)
{
fprintf(stderr, " mysql_stmt_init(), out of memory\n");
exit(0);
}
if (mysql_stmt_prepare(stmt, INSERT_QUERY, strlen(INSERT_QUERY)))
{
fprintf(stderr, "\n mysql_stmt_prepare(), INSERT failed");
fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
exit(0);
}
memset(bind, 0, sizeof(bind));
bind[0].buffer_type= MYSQL_TYPE_STRING;
bind[0].length= &
bind[0].is_null= 0;
/* Bind the buffers */
if (mysql_stmt_bind_param(stmt, bind))
{
fprintf(stderr, "\n param bind failed");
fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
exit(0);
}
/* Supply data in chunks to server */
if (!mysql_stmt_send_long_data(stmt,0,"MySQL",5))
{
fprintf(stderr, "\n send_long_data failed");
fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
exit(0);
}
/* Supply the next piece of data */
if (mysql_stmt_send_long_data(stmt,0," - The most popular open source database",40))


{
fprintf(stderr, "\n send_long_data failed");
fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
exit(0);
}
/* Now, execute the query */
if (mysql_stmt_execute(stmt))
{
fprintf(stderr, "\n mysql_stmt_execute failed");
fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
exit(0);
}


[解决办法]
linux C mysql的blob门类字段的插入和读取
[解决办法]
12.8. Cast函数和操作符
?BINARY
BINARY操作符将后面的字符串抛给一个二进制字符串。这是一种简单的方式来促使逐字节而不是逐字符的进行列比较。这使得比较区分大小写,即使该列不被定义为 BINARY或 BLOB。BINARY也会产生结尾空白,从而更加显眼。

mysql> SELECT 'a' = 'A';

-> 1

mysql> SELECT BINARY 'a' = 'A';

-> 0

mysql> SELECT 'a' = 'a ';

-> 1

mysql> SELECT BINARY 'a' = 'a ';

-> 0

BINARY影响整个比较;它可以在任何操作数前被给定,而产生相同的结果。

BINARY str 是CAST(str AS BINARY)的缩略形式。

注意,在一些语境中,假如你将一个编入索引的列派给BINARY, MySQL 将不能有效使用这个索引。

假如你想要将一个 BLOB值或其它二进制字符串进行区分大小写的比较,你可利用二进制字符串没有字符集这一事实实现这个目的,这样就不会有文书夹的概念。为执行一个区分大小写的比较,可使用 CONVERT()函数将一个字符串值转化为一个不区分大小写的字符集。其结果为一个非二进制字符串,因此 LIKE 操作也不会区分大小写:

SELECT 'A' LIKE CONVERT(blob_col USING latin1) FROM tbl_name;

若要使用一个不同的字符集, 替换其在上述语句中的latin1名。

CONVERT()一般可用于比较出现在不同字符集中的字符串。

?CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name)
CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。

这个类型 可以是以下值其中的 一个:

?BINARY[(N)]
?CHAR[(N)]
?DATE
?DATETIME
?DECIMAL
?SIGNED [INTEGER]
?TIME
?UNSIGNED [INTEGER]
BINARY 产生一个二进制字符串。关于它怎样影响比较结果的说明见本章中 BINARY操作符项。

假如给定了随意长度N,则 BINARY[N] 使 cast使用该参数的不多于 N 个字节。同样的, CHAR[N]会使 cast 使用该参数的不多于N 个字符。

CAST() and CONVERT(... USING ...) 是标准 SQL语法。CONVERT()的非USING 格式是ofis ODBC语法。

带有USING的CONVERT() 被用来在不同的字符集之间转化数据。在 MySQL中, 自动译码名和相应的字符集名称相同。例如。 这个语句将服务器的默认字符集中的字符串 'abc'转化为utf8字符集中相应的字符串:

SELECT CONVERT('abc' USING utf8);

当你想要在一个CREATE ... SELECT 语句中创建一个特殊类型的列,则cast函数会很有用:

CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);

该函数也用于ENUM 列按词法顺序的排序。通常ENUM列的排序在使用内部数值时发生。将这些值按照词法顺序派给 CHAR 结果:

SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);

CAST(str AS BINARY)和BINARY str相同。 CAST(expr AS CHAR) 将表达式视为一个带有默认字符集的字符串。

若用于一个诸如 CONCAT('Date: ',CAST(NOW() AS DATE))这样的比较复杂的表达式的一部分,CAST()也会改变结果。

你不应在不同的格式中使用 CAST() 来析取数据,但可以使用诸如LEFT() 或 EXTRACT() 的样的字符串函数来代替。请参见12.5节,“日期和时间函数”。

若要在数值语境中将一个字符串派给一个数值, 通常情况下,除了将字符串值作为数字使用外,你不需要做任何事:

mysql> SELECT 1+'1';

-> 2



若要在一个字符串语境中使用一个数字,该数字会被自动转化为一个BINARY 字符串。

mysql> SELECT CONCAT('hello you ',2);

-> 'hello you 2'

MySQL 支持带符号和无符号的64比特值的运算。若你正在使用数字操作符 (如 +) 而其中一个操作数为无符号整数,则结果为无符号。可使用SIGNED 和UNSIGNED cast 操作符来覆盖它。将运算分别派给带符号或无符号64比特整数。

mysql> SELECT CAST(1-2 AS UNSIGNED)

-> 18446744073709551615

mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);

-> -1

注意,假如任意一个操作数为一个浮点值,则结果为一个浮点值, 且不会受到上述规则影响 (关于这一点, DECIMAL 列值被视为浮点值)。

mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;

-> -1.0

若你在一个算术运算中使用了一个字符串,它会被转化为一个浮点数。

读书人网 >C语言

热点推荐