2010-01-15 112 views
2

我有時會將提供給我的CSV文件中的數據導入到mysql表中。php mysql:從數據庫中刪除一個特殊字符

在最後一個我做的一些條目在實際數據前有一個奇怪的壞字符,它被導入到我的數據庫中。現在我正在尋找一種方法來清理它。

壞數據在mysql列'email'中,它似乎總是在實際數據的前面。當試圖使用PHP在我的屏幕上打印它時,它顯示爲 。將其導出爲CSV文件時,它看起來像,如果我在使用PHP將它打印在屏幕上之前,它看起來像是一個普通空間。

我正在考慮編寫一個PHP腳本,該腳本一次覆蓋我的所有行,修復電子郵件地址字段並更新行。不過,我不太清楚「修復電子郵件」的部分!

我在想也許會做一個「爆炸」,並使用壞字符作爲分隔符,但我不知道如何將該字符輸入到我的代碼中。

有沒有辦法找到底層值/ utf8/hex或其他什麼字符,然後在字符串中找到它?

我希望它很清楚。

感謝

編輯: 在十六進制,它看起來就像是A0。我能做些什麼來搜索和刪除一個字符的十六進制值?無論是在PHP或直接在MySQL我猜...

回答

1

我想我發現了一個PHP的答案,似乎更可靠地工作:

$newemail = preg_replace('/\xA0/', '', $row['oldemail']); 

而且那麼我將用新電子郵件更新該行

+0

它的工作! (評論必須至少15個字符,所以我添加了這個) – 2010-01-15 20:36:02

1

可以修剪任何導致不可打印的ASCII字符的東西,如:

update t set email = substr(email, 2) where ascii(email) not between 32 and 126 

你可以用此得到違規字符的ASCII值:

select ascii(email) as first_char 
+0

問題是,並非所有行都有該問題。所以我不想抹掉合法的第一個字符。 – 2010-01-15 20:08:20

+0

你可以使用一個where(上面加上) – jspcal 2010-01-15 20:13:06

+0

這個選擇幾乎所有的行。我認爲WHERE部分有問題。它不應該只檢查第一個字符? – 2010-01-15 20:21:26

1

SELECT HEX(field)FROM table;應該有助於確定角色。

+0

它看起來像是'A0'。這有道理嗎? – 2010-01-15 20:07:25

+0

是它的不間斷的空間特徵。嘗試看看你是否可以用replace(在測試數據集上)更新表來設置email = replace(email,char(160),''); – ggiroux 2010-01-15 20:09:33

+0

它說,87行受到影響,但它仍然看起來相同 – 2010-01-15 20:17:41

1

作爲一種替代解決方案,從源頭上解決問題實際上可能更容易。我遇到類似的問題,從Excel導出的CSV文件,並一般發現,使用的東西沿線...

$correctedLine = mb_convert_variables('UTF-8', 'Windows-1252', $sourceLine); 

...往往糾正這個問題。 (這就是說,你需要確保你有多字節字符串擴展在/編譯時啓用。)