反序列化在PHP中:最好的選擇就是反序列化它,它串聯並把它交給你的客戶(出於性能,你會帶來他們給PHP之前縮小行)。在PHP
<?php
$data='a:2:{s:6:"Format";s:4:"NTSC";s:7:"License";s:4:"Home";}';
/* To unserialize and print */
$arr=unserialize($data); $out="";
foreach ($arr as $k => $val) {
$out.=$k.":".$val." ";
}
print "$out<br>";
?>
模式匹配:下一個選項是在正則表達式匹配PHP它(有沒有這樣做,雖然反序列化是更好的多少好處)。我將在這裏留下這個例子,以防萬一你想用正則表達式匹配做些什麼。
<?php
$data='a:2:{s:6:"Format";s:4:"NTSC";s:7:"License";s:4:"Home";}';
preg_match_all('/"(.*?)"/',$data, $result);
$out="";
for ($i = 0; $i < count($result[0]); $i+=2) {
print $result[1][$i].":".$result[1][$i+1]." ";
}
print "$out<br>";
?>
出口,加工,進口:如果表列不再被寫入序列化格式,如果只被讀它(取回遺留數據),您可以將其導出爲csv文件,在perl中處理數據,添加一個新列以包含由空格分隔的「Tag = Value」格式,並將該文件導入數據庫,並在其中插入新數據。如果您需要它,我可以爲您提供一個perl腳本來解析/轉換序列化的數據。
模式匹配MySQL的使用UDF的:如果,另一方面,如果你只是想在MySQL中使用正則表達式查詢本身(提取標籤/值),您可以通過使用此extension這樣做。它需要從源代碼構建,安裝。
在回答問題約RLIKE:如果你知道你的序列化數據的所有可能的格式(如果它看起來你很簡單),你可能會遇到的正則表達式使行成PHP之前(如果是性能問題)。
create table tt (data varchar(100));
insert into tt values ("a:2:{s:6:\"Format\";s:4:\"NTSC\";s:7:\"License\";s:4:\"Home\";}");
select data from tt where data rlike '"Format";s:[0-9]+:"NTSC"';
最簡單的(一個20分鐘的鍛鍊),選擇是隻將數據導出到AA csv文件,用Perl解析它,創建要進入一個新的列中的數據,並把它放回表(用一個新的專欄)。這個選項是否適用於你(如果表格是活的,即使在今天仍然不斷地以PHP格式寫入,它也不會工作)。在客戶端(PHP)中這樣做是否可行?此外,如果您有時間進行構建/安裝,並且您可以犧牲數據庫中的某些性能,那麼這裏是在MySql中使用UDF執行regex的代碼。 – blackpen
是的,我放棄了,現在我正在做這樣的事情。除非有人有辦法在MySQL中執行此操作,否則我會循環執行PHP中的每一行以執行自定義正則表達式。這僅僅是在客戶輸出他的訂單列表時偶爾完成的,所以它很醜,我討厭看我剛剛寫的東西,但它不是經常執行,客戶需要它很快:( – NaturalBornCamper
我會假設當你的客戶要求你得到的東西看起來像是正則表達式,你在MySql中運行一個近似正則表達式的查詢,查找「rlike正則表達式」,將這些行帶到PHP,運行提取並顯示給客戶端,我認爲這不會是這是一個糟糕的主意,只要客戶要求可以用RLIKE進行管理的東西。 – blackpen