MySQL中的MediumBlob字段里插入的图片,会比图片的实际大小多几个字节。再读取出来时就会出错。
问题:为什么插入的图片会多几个字节?

解决方案 »

  1.   

    你是如何插入图片数据的?从哪方面知道多了字节?测试如下,没有你说的这种情况。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: 0mysql>
    mysql> select hex(b1),length(b1) from tx;
    +------------------+------------+
    | hex(b1)          | length(b1) |
    +------------------+------------+
    | 3132333435363738 |          8 |
    +------------------+------------+
    1 row in set (0.00 sec)mysql>
      

  2.   

    开发环境
    Windowxp C# .netForm mysql-connector-net-6.0.3
      

  3.   

    象我一样,先做一个 10个字节的文件,然后通过你的程序打开并存入MYSQL,然后再读取看结果是什么?如果多了字节,则再到MYSQL下,直接象我一样用hex,length 查看一下你写入的数据是否正确。
      

  4.   

    最新状况1.在和MySQL同一台机器上执行,没有多字节现象
    2.在和MySQL不同的机器上执行程序,会有多字节现象
      

  5.   

    文件内的不同点原文件中的一部份  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........"..
      

  6.   

    哦,这样清楚了,应该是字符集的问题。检查一下你两台 mysql 的字符集设置,以及表中字符集的设置。用下述两个名字检查一下有何不同。show create table t1;
    show variables like 'char%';
      

  7.   

    使用 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\'
      

  8.   

    在数据库联接字符串里加了个 charset=gb2312 后,问题解决了。to : ACMAIN_CHM  
    1.show variables like 'char%' 的结果看哪个值?
      

  9.   

    表的结构呢? show create table t1;然后在另外一台上在你的 connection 中 用先传送执行一下 'set names 'utf8'"
      

  10.   

    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
      

  11.   

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

  12.   

    解决办法总结:
    在连接字符串中设定charset,值为服务器的字符集设定
      

  13.   

    在mysql中我使用longblob储存二进制字变少
    是这么回事
      

  14.   

    二进制上传是不进行任何格式转换,而字符上传,服务器会根据服务端存储字符集和客户端字符集的差异进行自动转化.在上传二进制的时候, 因为接口的原因,以及某些函数如load_file等, 会把二进制数据上传误当作字符上传.楼主之所以将客户端字符集设为GB2312后就解决问题, 是因为服务端和客户端字符集一样, 字符上传不存在转化,所以问题给予凑巧解决. 然而假如你服务端字符集设为UTF8, 你的客户端的工作环境为gb2312, 所以客户端字符集只能为gb2312(否则字符无法正确显示), 但此时用load_file上传二进制又有问题了,所以只能在上传前, 加个命令set names utf8(或set names ascii), 上传, 再set names gb2312恢复为原来的客户端.
      

  15.   

    谢谢您 这个问题我解决了我知道错误原因了
    错误原因:
    我将文件转为二进制数组 保存在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[],再将及其转换为文件即可我的的解决方法不知道适用不,我把我的解决方法提供给出现类似问题的同志们作参考,我想可能会有用谢谢各位,希望以后继续请教你们
      

  16.   

    上面我的解决方法 中的 Encoding.UTF8.GetString(stringBase64Bytes, 0, stringBase64Bytes.Length); UTF8可以是其他的 根据需要使用