2013-03-08 37 views
1

輸出serialize()不必要的垃圾等的字符串長度和其他東西,這是完全無用的。商店UTF-8 PHP陣列在MySQL無序列化()或json_encode()

a:2:{s:10:"SOME VALUE";a:35:{s:36:"VAL1";s:1:"1";s:7: skipped............... 

json_encode()比較好,但仍然沒有垃圾。

{"SOME VALUE":{"\u041a\u043e\u0434 \u041c\u0435\u0441\u0442\u0430 \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f":"1","\u0415-\u0414\u0422":"0","\u0420\u0435\u0436\u0438\u043c \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438":"0","\u041c\u0430\u0440\u0448\u0440\u0443\u0442":"0","\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439":"0","\u041e\u0442\u0432. \u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b 

爲什麼我需要所有這些東西而不是可讀數組? MySQL字段已被設置爲utf8_unicode_ci

其結果是我得到一個完全不必要的流量。

我的選擇是代替手工解析?

代碼不會不管這裏。

+0

他信息的youre爲了談論形式searialize心不是無用的,它的種類需要它被去系列化... – prodigitalson 2013-03-08 16:01:05

回答

4

答案很簡單。
不要將序列化數組存儲在數據庫中。

即使您認爲您目前不需要爲存儲的數據進行過濾或關係鏈接搜索,幾天後您會意識到您需要這一點,但仍無法區分此blob中的最小值。

因此,創建一個用於數據的常規表和每一個值存儲在一個單獨的字段。
而且您將按照自己想要的方式準確獲得您的數據 - 音質和安全。

+0

想過再一次...真的,到底是什麼?我將創建一個單獨的表並將其傳播到那裏...... – 2013-03-08 16:27:52

1

PHP 4和5中沒有內置的Unicode支持;在這種情況下,我使用這個函數來反序列化數據。序列化功能工作正常。

/** 
* Mulit-byte Unserialize 
* 
* UTF-8 will screw up a serialized string 
* 
* @access private 
* @param string 
* @return string 
*/ 
function mb_unserialize($string) { 
    $string = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $string); 
    return unserialize($string); 
} 

來源:http://dzone.com/snippets/mulit-byte-unserialize

1

在PHP 5.4 json_encode支持另外的選項標誌:JSON_UNESCAPED_UNICODE。 你會像下面這樣使用它:

$encoded = json_encode($array,JSON_UNESCAPED_UNICODE); 

這不會逃避UTF8序列(\u041a等)。

http://php.net/manual/en/function.json-encode.php

這就需要你使用的PHP版本> = 5.4,當然。

請注意:一般情況下存儲在數據庫中的序列化數據被認爲是不好的做法