2013-08-04 33 views
0

我正在用另一個人發送給我的用戶數據導入csv文件。該文件在多人之間來回發送,與不同操作系統上的不同程序一起工作。所以發生了一些編碼問題,我發現沒有簡單方式來解決它(是的,我把文件轉換爲UTF-8等)。regexp_replace中的轉義字符串 - Postgresql和PHP

數據存儲在postgresql數據庫中,我找到了一種轉換破損字符的方法。

例如:
A \ u0088 \u009Aº= U
A \ u0088 \u009A§= A
A \ u0088 \u009Aâ\ u0088 \ u0082 = O
...

PSQL我用以下語句轉換â\u0088\u009Aºü

SELECT COUNT(*) FROM sbl_students WHERE lastname ~* E'.*â\\u0088\\u009Aº.*'; 

=> 61

UPDATE sbl_students SET lastname = regexp_replace(lastname, E'â\\u0088\\u009Aº', 'ü', 'g'); 
SELECT COUNT(*) FROM sbl_students WHERE lastname ~* E'.*â\\u0088\\u009Aº.*'; 

=> 0

我試圖實現這個成PHP腳本,但由於某種原因,這是行不通的。 沒有被替換,並且沒有錯誤發生。

$dbh = pg_connect("dbname=iserv user=sbl"); 
$query = "UPDATE sbl_students SET lastname = regexp_replace(lastname, E'â\\u0088\\u009Aº', 'ü', 'g');"; 
pg_query($dbh, $query); 
pg_close($dbh); 

我已經嘗試過多種變化像regexp_replace(lastname, E'â\u0088\u009Aº', 'ü', 'g')regexp_replace(lastname, 'â\u0088\u009Aº', 'ü', 'g')但其中的非工作。

有人可以幫我嗎?我不明白爲什麼查詢在psql中工作得很好,但是在php中沒有做任何事情。

謝謝!


PostgreSQL的8.4
PHP 5.3.3-7 + squeeze16用了Suhosin貼片(CLI)

回答

0

我自己找到了答案。你必須使用pg_prepare()

$dbh = pg_connect("dbname=iserv user=sbl"); 
pg_prepare($dbh, "", "UPDATE sbl_students SET lastname = regexp_replace(lastname, $1, 'ü', 'g');"); 
pg_execute($dbh, "", array("â\u0088\u009Aº")); 
pg_close($dbh); 

還是不明白爲什麼:/

0

你可以嘗試這樣的事情?

$replacements = array(
    'â\u0088\u009Aº' => 'ü', 
    'â\u0088\u009A§' => 'ä', 
    'â\u0088\u009Aâ\u0088\u0082' => 'ö', 
    // ... 
); 

$lastname = str_replace(array_keys($replacements), array_values($replacements), $lastname); 
+0

謝謝您的回答,但我正在尋找一個SQL的解決方案。 –