2010-02-24 115 views
1

我收到錯誤消息日誌查詢0x9fPostgreSQL的:「無效的字節序列編碼‘UTF8’:只對錯誤

好了,現在我知道我的地方PHP應用程序試圖使用0x9f字符查詢。 但我不知道在哪裏。

我檢查的postgresql.conf,但我沒有找到像「log_on_error」任何東西。這裏只有這將導致Postgres的記錄所有的選擇,或只是所有查詢log_statement參數。 但什麼我希望看到的是:

ERROR: "Invalid byte sequence for encoding "UTF8": 0x9f 
QUERY: SELECT * FROM blabla WHERE field1='blabla0x9f' 

在這種情況下,我將能夠看到哪個查詢造成了這種情況。所以我知道在哪個php腳本中檢查。

這是可能與postgres?我的psql版本是8.3.9。

回答

2

您正在尋找log_min_error_statement。

但在文本被解析爲語句之前,解析器中會出現「無效的字節序列」。所以沒有辦法記錄它,而不會冒着記錄在奇怪的編碼中,並使其無用或危險。

但是假設你的PHP應用程序檢測到錯誤?如果沒有,你沒有檢查足夠的返回代碼;)

+0

好,不過這怎麼可能發生? 我的所有頁面都在utf-8中(在html頭文件中使用charset = utf-8)。 我的數據庫是UTF-8。那麼這怎麼發生。 你知道0x9f是什麼字符嗎? – NovumCoder 2010-02-25 09:03:50

+0

這些頁面在UTF-8中非常明顯不被處理*。很可能您的PHP環境不適用於UTF8。我不是PHP專家,所以我不知道如何設置。也許default_charset是你想要在你的PHP配置中設置的? – 2010-02-26 10:01:43

+0

「0x9f」是一個十六進制值爲9f(= 159)的字節。你確定你的查詢沒有說'\ 0x9f',那個反斜槓很重要。原因可能是有人在您的網站上尋找SQL注入漏洞。 – Jasen 2015-05-20 01:08:33

1

只是要清楚,因爲我不認爲馬格努斯通過(儘管他的回答很不錯):如果你讀取 UTF文件-8,但它是用latin1編碼的,它不會奇蹟般地轉換爲utf8。只能使用文件編碼中的文件,無論是將文件提交給數據庫還是使用其他編碼重新編碼。你有三個選擇(我可以使用):

當然,最右邊的方法是第一個。

  1. 使用PHP轉換文件。有關詳細信息,請閱讀docs on recode。使用set client_encoding = encoding更改postgresql上的client_encoding。你可以找到valid encoding in the docs

  2. 它發送到PostgreSQL轉換read the docs on PostgresSQL's convert()

Information about the php function recode`

+0

選項4:'$ f = popen(「iconv -f latin-1 -t utf8 Jasen 2015-05-20 01:12:19

相關問題