2010-08-16 37 views
0

當我嘗試編輯某種內容類型時,我的Web應用程序崩潰了,而且我非常確定這是因爲我的數據庫中有些奇怪的字符。所以,當我做的:有趣的人物在我的db

SELECT body FROM message WHERE id = 666 

返回:

<p>⢠<span></span></p><p><br /></p><p><em><strong>NOTE:</strong> Please remember to use your to participate in the discussion.</em></p> 

然而,當我試圖計算有多少文件有那些字符Postgres的抱怨:

foo_450_prod=# SELECT COUNT(*) FROM message WHERE body LIKE'%â¢%'; 

ERROR: invalid byte sequence for encoding "UTF8": 0xe2a225 
HINT: This error can also happen if the byte sequence does not match the encodi 

有誰知道是什麼問題是和我如何可以查詢這些有趣的人物?

在此先感謝!

+1

666不好(https://secure.wikimedia.org/wikipedia/en/wiki/Number_of_the_Beast)。也許這就是問題所在? ;) – NinjaCat 2010-08-16 22:01:21

+0

目前還不清楚你在哪裏檢查結果。在一些數據庫管理工具?哪一個?嘗試使用PgAdminIII查看數據庫內容。 – BalusC 2010-08-16 22:03:24

+0

什麼是您的數據庫編碼? – NinjaCat 2010-08-16 22:04:19

回答

0

在你的數據庫和從你的網頁上打印一些數據之間已經有很長的路要走了:你的數據庫編碼可能沒問題,但你可能試圖在ISO-8859-1中以UTF-8格式打印最初的東西(而不是「有趣」的角色)。你有這樣的:在你的HTML頁面的<head>標籤

<meta content="text/html; charset=UTF-8" http-equiv="content-type" /> 

另外,當連接到你的數據庫時,你是否設置SET NAMES 'utf8'

+0

嗡嗡聲也許,但堆棧跟蹤告訴我這是一個SQL錯誤... – hdx 2010-08-16 22:18:01

+0

但你只有當你嘗試SELECT使用錯誤的編碼(LIKE'%â¢%'),對吧? – darma 2010-08-16 22:24:19

+0

如果數據庫是utf-8,那麼它肯定聽起來像網頁不是UTF-8。 – NinjaCat 2010-08-16 22:30:19

1

看來您的SELECT聲明被解釋爲ISO-8859-1或windows-1252。在這些編碼中,'== 0xE2,''== == 0xA2和'%'== 0x25,它解釋了錯誤消息中提到的0xe2a225字節序列。

什麼是很難弄清楚爲什麼你的第一個SELECT返回â¢開始。這是一個不太可能使用的字符組合,但它也不是UTF-8/windows-1252 mojibake的典型情況,因爲E2 A2不是有效的UTF-8。它可能是一個字符的前2個字節,但該字符將是一個布萊葉點陣圖形(U + 2880到U + 28BF),這在那裏也沒有意義。