热搜:NVER node 开发 php

保存图片指纹(一串乱码)到mysql, 求分析

2024-09-20 18:40:01
保存图片指纹(一串乱码)到mysql, 求分析

本帖最后由 JJ___JJ 于 2013-08-08 15:10:59 编辑

MySQL 乱码

各位大大, 图片指纹如下:

  
sql为:
 update test set `bitmap` ='?+W&+N{|\0Ox0\\$8)sld\"Z|y|\0ZZ!\0]P!Zw\Z\Zgm|p\"y^W|)Q,\0xc{\0\Z\\[#]pEXcto[ER`\'l{b&8P8j[w1y^t|d0YSMK![sj\0Kyww7)PE\ZIPv^m|\0\0\0{\0PK^\0y|x-e^|jcxc|`N' where id = 168; 

bitmap字段为varchar 255
很奇怪的一件事, 直接php运行sql, 会报错:
$query = "update test set `bitmap` ='".mysql_real_escape_string($bitmap)."' where id = {$picture['id']};";1366: Incorrect string value: '\xDD[+W&+...' for column 'bitmap' at row 1


直接copy这段sql去mysql客户端执行, 是没问题的. 目前认为是copy的时候, 这段指纹乱码没有能copy完整, 或者已经变了,
如果不加mysql_real_escape_string, 而是将指纹乱码保存到文本, 是无法copy出来 只能粘贴处部分. 
求大大们帮忙分析, 非常感谢.

回复讨论(解决方案)

大大给点意见啊

保存 base64 编码,可免去一切烦恼

直接保存,则bitmap字段必须为二进制的
但并不保证一定能存储成功

保存 base64 编码,可免去一切烦恼

直接保存,则bitmap字段必须为二进制的
但并不保证一定能存储成功
好的, 谢谢, 我试试.

保存 base64 编码,可免去一切烦恼

直接保存,则bitmap字段必须为二进制的
但并不保证一定能存储成功
感谢版主大大提醒, 已经成功保存到数据库. 取出来也没有问题.
不过bitmap字段为什么必须为二进制的, 我现在保存为char类型, 有问题么, 我看了下结果长度固定, 而且二进制类型向来少用, 所以选择了char类型.

理论上说,数据库是放进去什么,取出来还是什么
但数据库具体实现时为了解决搜索的问题,都做了一些个性化调整
比如 mysql 的字符类型字段 char、varchar、txt 都不区分大小写,都有一个连接校对。这样便于文字的处理
但是二进制内容并不需要数据库干涉,干涉了反而要出问题

字节型可以记录例如 [del] [null] 之类的字节,但字符串就没法记录了,所以要原样保留就要用字节
或者通过可逆编码(base64)把上述不可视字节转为可视字符才能保存,提取是反向解码就是了

理论上说,数据库是放进去什么,取出来还是什么
但数据库具体实现时为了解决搜索的问题,都做了一些个性化调整
比如 mysql 的字符类型字段 char、varchar、txt 都不区分大小写,都有一个连接校对。这样便于文字的处理
但是二进制内容并不需要数据库干涉,干涉了反而要出问题
非常感谢.

字节型可以记录例如 [del] [null] 之类的字节,但字符串就没法记录了,所以要原样保留就要用字节
或者通过可逆编码(base64)把上述不可视字节转为可视字符才能保存,提取是反向解码就是了
谢谢提醒, 已经这样做了.