sql server中建立了一个image字段,在查询分析器看了下有16位的长度,
2的16次方=64k,我以为只能放64k的文件,但我实际测试了一下可以存好几M的文件,这个不知道是怎么回事?另外存放10多M的文件就不行了,我用ftp存几百M都没问题。不知道image字段的长度是怎么算的,大的文件上传怎么解决,很容易出现虚拟内存过大,很慢很慢。

解决方案 »

  1.   

    text或image字段是存储指向实际数据存放地趾的指针,text与ntext数据类型在单个值中可以包含非常大的数据最(最大可达2GB)
      

  2.   

    也不太好解释,看邹写的书里有这段.单条记录总字节数不能大于8060,但text,ntext中不一样,单独存在表的数据页中,也就是列存的是指向数据页的指针,也可以设置text in row ,
    把满足条件的text与ntext存储在数据行中(此处就不是存指针了)
    exec sp_tableoption [@tablenamepattern=]'table'
    ,[@optionname=]'text in row'
    ,[@optionvalue=]'value'
    @optionvalue有效值为0 off on或是24-4000的整数,
    分别表示关闭text in row 功能
    开启text in row 功能 value=on相当于value=256,这样可以把text或ntext数据存储在行中(非单独的数据页)
      

  3.   

    呵呵,我自己理解默认存的就是指针,所以不用太大,而实际存储的位置是其它的数据页,
    记住最大能存储2GB就可以了.
    打开text in row 大概就是如果在某字段中数据小于8000字节(小于行的存储量)就不存指针,直接存数据.长度也就应该不是默认的16了
      

  4.   

    而且我跟踪了下数据库发现是用update语句把文件更新到image字段里的
      

  5.   

    如果数据值不超8000字节,可在update 中用.如果超过8000逐块处理.
    处理函数包括
    TEXTPTR
    返回对应于 varbinary 格式的 text、ntext 或 image 列的文本指针值。检索到的文本指针值可用于 READTEXT、WRITETEXT 和 UPDATETEXT 语句。
    TEXTVALID 
    检查特定文本指针是否有效的 text、ntext 或 image 函数。
    READTEXT
    从 text、ntext 或 image 列读取 text、ntext 或 image 值,从指定的偏移量开始读取指定的字节数。
    UPDATETEXT
    更新现有的 text、ntext 或 image 字段。使用 UPDATETEXT 可以只更改 text、ntext 或 image 列的一部分。使用 WRITETEXT 可以更新和替换整个 text、ntext 或 image 字段。
    WRITETEXT
    允许对现有的 text、ntext 或 image 列执行最小日志记录的交互式更新。WRITETEXT 将覆盖受其影响的列中的所有现有数据。WRITETEXT 语句不能用于视图中的 text、ntext 和 image 列。