如何往mysql里面存blob

如何往mysql里面存blob,第1张

以下的文章主要介绍的是MySQLtext与blob字段类型的不同之处的比较,同时本文也有对MySQLtext与blob字段类型的实际应用的介绍,如果你对MySQLtext与blob字段类型相关的实际 *** 作有兴趣的话,你就可以对以下的文章点击观看了。1.blob是二进制大对象,可以容纳可变量数量的数据,其中blob分为4中类型:TINYBLOB,BLOB,mediumblob和LongBlob,他们容纳的长度是不同的.Text同样也分为四种类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT2.blob被视为二进制字符串,Text被视为非二进制字符串blob列没有字符集,并且排序和比较基于列值字节的数值值。TEXT列有一个字符集,并且根据字符集的校对规则对值进行排序和比较。在MySQLTEXT或BLOB列的存储或检索过程中,不存在大小写转换,当未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值值,值被截取以保证适合。如果截掉的字符不是空格,将会产生一条警告。使用严格SQL模式,会产生错误,并且值将被拒绝而不是截取并给出警告.在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列。同样,可以将TEXT列视为VARCHAR列。3.BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR.BLOB和TEXT列不能有默认值.当保存或检索BLOB和TEXT列的值时不删除尾部空格。(这与VARBINARY和VARCHAR列相同).对于BLOB和TEXT列的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的.LONG和LONGVARCHAR对应MEDIUMTEXT数据类型。这是为了保证兼容性。如果TEXT列类型使用BINARY属性,将为列分配列字符集的二元校对规则.MySQL连接程序/ODBC将BLOB值定义为LONGVARBINARY,将MySQLTEXT值定义为LONGVARCHAR。由于BLOB和TEXT值可能会非常长,使用它们时可能遇到一些约束.BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序。例如,可以使用MySQL和MySQLdump来更改客户端的max_allowed_packet值.

Java注册用户MySQL储存文件可以放在MySQL数据库中,即使用MySQL中的BLOB(Binary Large Object)类型来存储文件。首先,需要创建一个存储文件的字段,类型为BLOB。然后,使用Java代码将文件读取到字节数组中,最后使用PreparedStatement对象将字节数组插入到数据库中。

先在本地装了个Mysql,又装了个navicat管理工具,又新建了个工程来测试:

简单的测试方法,就是放一个按钮,点击一下,读取远程图片,然后存到数据库,再读取出来显示到界面上。

管理工具随意建了个表“D1”,弄了三个id,img,name三个字段。

示例代码如下,因为测试,代码就没写的太规范:

protected

void

btnTest_Click(object

sender,

EventArgs

e)

{

string

url

=

"http://www.baidu.com/img/baidu_jgylogo3.gif"

bool

result

=

false

int

id

=

0

string

conn

=

"host=127.0.0.1Port=3306Database=testuid=rootpwd=123456"

//

string

conn

=

"server=.database=demouid=sapwd=123456"

using

(MAction

action

=

new

MAction("d1",

conn))

{

WebClient

wc

=

new

WebClient()

try

{

//if

(action.Fill(2))

//{

byte[]

data

=

wc.DownloadData(url)

action.Set("img",

data)

action.Set("name",

"ldf")

result

=

action.Insert(InsertOp.ID)

id

=

action.Get<int>("id")

//}

}

catch

(Exception

err)

{

Log.WriteLogToTxt(err)

}

}

if

(result)//再开一个读取试试

{

using

(MAction

action

=

new

MAction("d1",

conn))

{

if

(action.Fill(id))

{

Response.BinaryWrite(action.Get<byte[]>("img"))

}

}

}

解决与调试经过:

经本地测试,调试,发现对blob类型的参数赋值时,抛出异常:索引超出了数组界限。

异常太迷惑,网上搜了一下,有人说是:Mysql.dll的版本问题,花了一个csdn积分下了一个6.2.3版本,还是不顶用。

然后无意识的进行调试,估计运气问题,竟然让我发现了问题所在,只能说是运气好。

看一段小代码,对参数的赋值,参数多数据库支持时,类似这种写法:

DbParameter

para

=

_fac.CreateParameter()//通过工厂广告获得当前数据库类型的参数

para.ParameterName

=

parameterName

para.Value

=

value

==

null

?

DBNull.Value

:

value

para.DbType

=

dbType

if

(size

>

-1)//设定长度。

{

para.Size

=

size

}

para.Direction

=

direction

这代码其实很简单:

产生了一个参数,然后赋参数名,参数值,参数类型,参数大小和参数指向。

而Mysql竟然在对参数Size赋值的问题处理上有些Bug。

当我调试跳过对para.Size赋值时,竟然正常了。

于是代码改成了这样:

if

(dbType

!=

DbType.Binary

&&

size

>

-1)//mysql不能设定长度,否则会报索引超出了数组界限错误。

然后我测试了下其它数据库,发现指定size是正常的,最后得出一结论:

经过测试,其它数据库类型对Size的赋值是正常的,唯Mysql有问题,为此,在编写进行多数据库支持的框架时,总会时不时的遇到好多问题,别纠结,始终要解决。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6123384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-15
下一篇 2023-03-15

发表评论

登录后才能评论

评论列表(0条)

保存