MySQL中的MediumBlob字段里插入的图片的问题

xvting 2009-06-15 12:03:29
MySQL中的MediumBlob字段里插入的图片,会比图片的实际大小多几个字节。再读取出来时就会出错。
问题:为什么插入的图片会多几个字节?
...全文
1427 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhzhzhchch 2009-11-25
  • 打赏
  • 举报
回复
上面我的解决方法 中的 Encoding.UTF8.GetString(stringBase64Bytes, 0, stringBase64Bytes.Length); UTF8可以是其他的 根据需要使用
zhzhzhchch 2009-11-25
  • 打赏
  • 举报
回复
谢谢您 这个问题我解决了

我知道错误原因了
错误原因:
我将文件转为二进制数组 保存在mysql数据库中,写了 Insert into imageInfoData(name,ImageData) values(@name,@ImageData)语句 ,@ImageData是占位的(预处理参数),使用MySqlDriver
在替换预处理参数时需要将byte[]转换为字符串,用System.Text.Encoding.Default.GetString((byte[])Value)将byte[]转换为字符串时出了问题
编码方式改变了,这个方法我用于不是文件的byte[]就可以,也就是说文件的byte[]转为字符串不能使用该方法.但是MysqlDriver提供的只是一个接口 我重新写一个接口,必须使用它,于是我找到了一个解决方法.

解决方法:
// 将图像8位无符号整数数组转换为它等效的System.string表示形势(使用64数字编码)
string fileBase64String = Convert.ToBase64String(bytes);

// 再将System.string的所有字符编码为一个字符系列
byte[] stringBytes = Encoding.UTF8.GetBytes(fileBase64String);
在将stringBytes 传到MysqlDriver的接口中,替换时用到System.Text.Encoding.Default.GetString(byte[])方法转为字符串就不会出现问题了,保存到数据库中,从数据库中去出来是用
string fileBase64String = Encoding.UTF8.GetString(stringBase64Bytes, 0, stringBase64Bytes.Length);

// 将指定的System.string(它将二进制数据编码为base64)转换为等效的8位无符号整数数组
byte[] bytes = Convert.FromBase64String(fileBase64String);
这样就得到文件byte[],再将及其转换为文件即可

我的的解决方法不知道适用不,我把我的解决方法提供给出现类似问题的同志们作参考,我想可能会有用

谢谢各位,希望以后继续请教你们

trainee 2009-11-18
  • 打赏
  • 举报
回复
二进制上传是不进行任何格式转换,而字符上传,服务器会根据服务端存储字符集和客户端字符集的差异进行自动转化.

在上传二进制的时候, 因为接口的原因,以及某些函数如load_file等, 会把二进制数据上传误当作字符上传.

楼主之所以将客户端字符集设为GB2312后就解决问题, 是因为服务端和客户端字符集一样, 字符上传不存在转化,所以问题给予凑巧解决.

然而假如你服务端字符集设为UTF8, 你的客户端的工作环境为gb2312, 所以客户端字符集只能为gb2312(否则字符无法正确显示), 但此时用load_file上传二进制又有问题了,所以只能在上传前, 加个命令set names utf8(或set names ascii), 上传, 再set names gb2312恢复为原来的客户端.
zhzhzhchch 2009-11-17
  • 打赏
  • 举报
回复
在mysql中我使用longblob储存二进制字变少
是这么回事
kaiyi1986 2009-06-18
  • 打赏
  • 举报
回复
把图片的路径存到数据库里,然后要显示的时候,读出路径来,然后去相应的地方加载图片。这样行的通吗?
xvting 2009-06-16
  • 打赏
  • 举报
回复
文件内的不同点

原文件中的一部份 00
多字节文件中被替换为 5C 30

原文件
00000000h: FF D8 FF E0 00 10 4A 46 49 46 00 01 01 00 00 01 ; ??.JFIF......
00000010h: 00 01 00 00 FF DB 00 43 00 0A 07 07 08 07 06 0A ; ....?C........
00000020h: 08 08 08 0B 0A 0A 0B 0E 18 10 0E 0D 0D 0E 1D 15 ; ................
00000030h: 16 11 18 23 1F 25 24 22 1F 22 21 26 2B 37 2F 26 ; ...#.%$"."!&+7/&
00000040h: 29 34 29 21 22 30 41 31 34 39 3B 3E 3E 3E 25 2E ; )4)!"0A149;>>>%.
00000050h: 44 49 43 3C 48 37 3D 3E 3B FF DB 00 43 01 0A 0B ; DIC<H7=>;?C...
00000060h: 0B 0E 0D 0E 1C 10 10 1C 3B 28 22 28 3B 3B 3B 3B ; ........;("(;;;;
00000070h: 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B ; ;;;;;;;;;;;;;;;;
00000080h: 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B ; ;;;;;;;;;;;;;;;;
00000090h: 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B FF C0 ; ;;;;;;;;;;;;;;


00000000h: FF D8 FF E0 5C 30 10 4A 46 49 46 00 01 01 00 00 ; ?郳0.JFIF.....
00000010h: 01 00 01 00 00 FF DB 5C 30 43 00 0A 07 07 08 07 ; .....踈0C......
00000020h: 06 0A 08 08 08 0B 0A 0A 0B 0E 18 10 0E 0D 0D 0E ; ................
00000030h: 1D 15 16 11 18 23 1F 25 24 22 1F 22 21 26 2B 37 ; .....#.%$"."!&+7
00000040h: 2F 26 29 34 29 21 22 30 41 31 34 39 3B 3E 3E 3E ; /&)4)!"0A149;>>>
00000050h: 25 2E 44 49 43 3C 48 37 3D 3E 3B FF DB 5C 30 43 ; %.DIC<H7=>;踈0C
00000060h: 01 0A 0B 0B 0E 0D 0E 1C 10 10 1C 3B 28 22 28 3B ; ...........;("(;
00000070h: 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B ; ;;;;;;;;;;;;;;;;
00000080h: 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B ; ;;;;;;;;;;;;;;;;
00000090h: 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B ; ;;;;;;;;;;;;;;;;
000000a0h: 3B FF C0 5C 30 11 08 00 0C 00 17 03 01 22 00 02 ; ;繺0........"..
xvting 2009-06-16
  • 打赏
  • 举报
回复
最新状况

1.在和MySQL同一台机器上执行,没有多字节现象
2.在和MySQL不同的机器上执行程序,会有多字节现象
xvting 2009-06-16
  • 打赏
  • 举报
回复
解决办法总结:
在连接字符串中设定charset,值为服务器的字符集设定
ACMAIN_CHM 2009-06-16
  • 打赏
  • 举报
回复

'character_set_client', 'utf8'
'character_set_connection', 'utf8'


) ENGINE=InnoDB DEFAULT CHARSET=gbk 这儿你用的GBK,会产生字符编码的转换。


xvting 2009-06-16
  • 打赏
  • 举报
回复
show create table image

结果

CREATE TABLE `image` (
`imageID` int(10) unsigned NOT NULL auto_increment,
`imageInformation` mediumblob NOT NULL,
PRIMARY KEY (`imageID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk

ACMAIN_CHM 2009-06-16
  • 打赏
  • 举报
回复

表的结构呢? show create table t1;

然后在另外一台上在你的 connection 中 用先传送执行一下 'set names 'utf8'"
xvting 2009-06-16
  • 打赏
  • 举报
回复
在数据库联接字符串里加了个 charset=gb2312 后,问题解决了。

to : ACMAIN_CHM
1.show variables like 'char%' 的结果看哪个值?


xvting 2009-06-16
  • 打赏
  • 举报
回复
使用 show variables like 'char%';

显示下面

'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'gbk'
'character_set_results', 'utf8'
'character_set_server', 'gbk'
'character_set_system', 'utf8'
'character_sets_dir', 'C:\Program Files\MySQL\MySQL Server 5.0\share\charsets\'
ACMAIN_CHM 2009-06-16
  • 打赏
  • 举报
回复

哦,这样清楚了,应该是字符集的问题。

检查一下你两台 mysql 的字符集设置,以及表中字符集的设置。

用下述两个名字检查一下有何不同。

show create table t1;
show variables like 'char%';
ACMAIN_CHM 2009-06-15
  • 打赏
  • 举报
回复

你是如何插入图片数据的?从哪方面知道多了字节?

测试如下,没有你说的这种情况。

C:\>debug edit3
-r
AX=0000 BX=0000 CX=0008 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C9 ES=13C9 SS=13C9 CS=13C9 IP=0100 NV UP EI PL NZ NA PO NC
13C9:0100 3132 XOR [BP+SI],SI SS:0000=20CD
-d
13C9:0100 31 32 33 34 35 36 37 38-00 00 00 00 00 00 00 00 12345678........
13C9:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 B8 13 ............4...
13C9:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C9:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C9:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C9:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C9:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C9:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-

mysql> desc tx;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| b1 | mediumblob | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.06 sec)

mysql>
mysql> update tx
-> set b1=LOAD_FILE('C:/edit3');
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql>
mysql> select hex(b1),length(b1) from tx;
+------------------+------------+
| hex(b1) | length(b1) |
+------------------+------------+
| 3132333435363738 | 8 |
+------------------+------------+
1 row in set (0.00 sec)

mysql>


ACMAIN_CHM 2009-06-15
  • 打赏
  • 举报
回复

象我一样,先做一个 10个字节的文件,然后通过你的程序打开并存入MYSQL,然后再读取看结果是什么?

如果多了字节,则再到MYSQL下,直接象我一样用hex,length 查看一下你写入的数据是否正确。
xvting 2009-06-15
  • 打赏
  • 举报
回复
开发环境
Windowxp C# .netForm mysql-connector-net-6.0.3

56,912

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧