本帖最後由 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)把上述不可視位元組轉為可視字元才能儲存,提取是反向解碼就是了
謝謝提醒, 已經這樣做了.