2016-10-04 50 views
0

任意號碼,這樣我的項目以前的編碼器決定把PHP-seralized信息在MySQL數據庫中像這樣的:MySQL的提取幾個子在SELECT,次

a:2:{s:6:"Format";s:4:"NTSC";s:7:"License";s:4:"Home";} 

或者

a:1:{s:4:"Size";s:1:"S";} 

我需要使用MySQL直接什麼引號之間的,以顯示此提取:

Format: NTSC, License: Home 

或者

Size: S 

所以我需要基本保持在引號之間有什麼並連接它。我可以使用像Looking to extract data between parentheses in a string via MYSQLMySQL: Use REGEX to extract string (select REGEX)但我不能因爲屬性的數量是任意的(0,1,2,3,...),而不是總是2例如。

任何方式來做到這一點?

+0

最簡單的(一個20分鐘的鍛鍊),選擇是隻將數據導出到AA csv文件,用Perl解析它,創建要進入一個新的列中的數據,並把它放回表(用一個新的專欄)。這個選項是否適用於你(如果表格是活的,即使在今天仍然不斷地以PHP格式寫入,它也不會工作)。在客戶端(PHP)中這樣做是否可行?此外,如果您有時間進行構建/安裝,並且您可以犧牲數據庫中的某些性能,那麼這裏是在MySql中使用UDF執行regex的代碼。 – blackpen

+0

是的,我放棄了,現在我正在做這樣的事情。除非有人有辦法在MySQL中執行此操作,否則我會循環執行PHP中的每一行以執行自定義正則表達式。這僅僅是在客戶輸出他的訂單列表時偶爾完成的,所以它很醜,我討厭看我剛剛寫的東西,但它不是經常執行,客戶需要它很快:( – NaturalBornCamper

+0

我會假設當你的客戶要求你得到的東西看起來像是正則表達式,你在MySql中運行一個近似正則表達式的查詢,查找「rlike正則表達式」,將這些行帶到PHP,運行提取並顯示給客戶端,我認爲這不會是這是一個糟糕的主意,只要客戶要求可以用RLIKE進行管理的東西。 – blackpen

回答

1

反序列化在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"'; 
+0

感謝yas!我接受了你的解決方案。然而,你認爲「RLIKE」是什麼意思?這是我很好奇的。 – NaturalBornCamper

+0

@NaturalBornCamper,更新了答案,包括我在說什麼關於RLIKE來縮小行數。 – blackpen

1

編寫一個PHP腳本來反序列化並打印它。這比使用正則表達式更容易。

+0

這就是我的感受 – blackpen