因为存入的二进制数据要打入sql语句。所以存入前需要用函数将二进制数据中特殊字符过滤掉。以免数据破坏sql语句。
从mysql中读取数据后没有做任何处理。这样的数据根本不是二进制数据了啊。(0x00、0x1a之类的东西都被过滤掉了)
从网上看到将图片以二进制方式存入数据库。也是这样。
(http://www.anyexample.com/programming/php/php_mysql_example__image_gallery_(blob_storage).xml)问题一:我就不明白了。这样读出的图片应该产生错误啊。(图片也是二进制文件,过滤会破坏它啊)
问题二:php中到底能不能存取mysql中的二进制数据。如果能。如何操作才能保证存入前与读出后的数据一样啊。如果不能保证,存取二进制数据还有什么意义呢?

解决方案 »

  1.   

    二进制中会有0x00
    0x00也是字符串的结束符
    不过滤,会将字符串截断。
    还有很多其它数值,不要说进入数据库了。连进字符串都不行。
    下面是过滤函数
    mysqli_real_escape_string
    Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.
    stripslashes过滤\\
    ...
      

  2.   

    应该是“转义”,而不是“滤掉”!通过“转义”,可以在字符串中表达任何字符。--------
    With sufficient thrust, pigs fly just fine. However, this is not necessarily a good idea. It is
    hard to be sure where they are going to land, and it could be dangerous sitting under them as they
    fly overhead.
      

  3.   

    如果是转义。php应该提供相应的反转义函数。
    但我没找到相应反转义函数。我自己做过试验:
    mysqli_real_escape_string处理
    存入数据库
    从数据库中读取
    存入文件原始数据是exe文件。结果读出的数据少了几百字节。
    如果是转义。应该多几百字节啊。
    要将255种字符中某些字符转义。最终字符集至少多于255啊。不然转义符就与原字符集中的字符重复了啊。
    所以我觉得是过滤掉了。
      

  4.   

    本帖最后由 xuzuning 于 2010-09-19 11:49:34 编辑
      

  5.   

    感谢版主。
    我运行一下代码试试。
    http://www.anyexample.com/programming/php/php_mysql_example__image_gallery_(blob_storage).xml
      

  6.   

    http://www.anyexample.com/programming/php/php_mysql_example__image_gallery_(blob_storage).xml
    代码可以保存和读取二进制数据。是我的测试代码有问题。我再回去查一下。
    感谢楼上两位大侠!