none
image 字段类型,在 insert into 后数据发生变化。 RRS feed

  • 问题

  • 问题:

    image 字段类型,进行insert into 插入操作之后,

    若该 image 字段在数据库中存储的长度 > 43679 ,则会发生截断,截断部分的数据和未截断之前是一样的。

    若该 image 字段在数据库中存储的长度 = 43679, 则数据会发生变化: 在 0x 后面会多一个 0 ,并会把该数据最后一位去掉。保证长度为 43679。

    请问 0 是怎么出现的?为什么会出现这种情况?

    ps:由于插入的数据太长,所以只能通过脚本的方式把问题说明。

    image字段类型insert后问题描述及建表脚本.sql ;下载地址为:

    http://www.kuaipan.cn/file/id_180137551233810436.htm


    2013年11月28日 5:35

答案

  • image 是按字典存储的, 0x123 这样的,是两字节,每个字节是两个字符位表示,所以 0x123 的标准表示是 0x0123

    你的那个脚本中,第二条记录,带0x一起算字符长度,是 43697,也就是单的,所以存储之后会变成标准的,会在最前面实一个0

    至于你说的截断,没有发现这个问题,也许是显示的问题,你可以用 datalength 求长度

    • 已标记为答案 brigchang 2013年11月28日 7:33
    2013年11月28日 6:16

全部回复

  • image 是按字典存储的, 0x123 这样的,是两字节,每个字节是两个字符位表示,所以 0x123 的标准表示是 0x0123

    你的那个脚本中,第二条记录,带0x一起算字符长度,是 43697,也就是单的,所以存储之后会变成标准的,会在最前面实一个0

    至于你说的截断,没有发现这个问题,也许是显示的问题,你可以用 datalength 求长度

    • 已标记为答案 brigchang 2013年11月28日 7:33
    2013年11月28日 6:16
  • 请问邹建大侠

    为什麽第一条记录不是0开头呢?


    2013年11月28日 7:00
  • 桦仔你是程序员,一个byte多长都没搞清楚?

    邹建说得很清楚了。你仔细想想。


    想不想时已是想,不如不想都不想。

    2013年11月28日 7:29
    版主
  • 邹建大侠:

         刚我用 datalength 求长度之后, 1 的数据长度是51362, 2 的数据长度是 21839 ;

         43697是这样得来的: select len('1 或 2 的数据'),发现这样处理有可能是 datalength 的两倍:

    1 的数据长度是 106326 ,2 的数据长度是 43697 。也就是说对于想 image 类型不能通过len()这样处理哈。

    然后,通过 datalength 和 从数据表中把 insert 之后的数据来len() 求的长度对比,发现这样求的话数据长度差别很大,不是近乎2倍的关系,很可能是你说的显示问题。

    通过  INSERT INTO Image_Test VALUES(4,0x1234)

             INSERT INTO Image_Test VALUES(5,0x123)  测试后,的确如你所说的。我基本弄清楚是什么情况了。就是字典存储暂时不明白。我再找找资料。非常感谢邹建大侠!
    2013年11月28日 7:33
  • 林桑,我基本上明白了。我是  INSERT INTO Image_Test VALUES(4,0x1234)  和  INSERT INTO Image_Test VALUES(5,0x123) 测试来看的。同样谢谢你哈。

    2013年11月28日 7:35
  • 我当然知道一个byte多长

    我后来想一想明白了

    0x123 这样的,是两字节,每个字节是两个字符位表示,所以 0x123 的标准表示是 0x0123

    2013年11月28日 8:22