Postgresql

錯誤:用於編碼“UTF8”的無效字節序列:pg_stat_statements 中的 0x00

  • January 20, 2022

我正在嘗試使用 pg_stat_statements 來優化我的查詢,但遇到了意外的障礙。

SELECT total_plan_time + total_exec_time as total_time, query
FROM pg_stat_statements
ORDER BY total_time
DESC LIMIT 10;

結果是 ERROR: invalid byte sequence for encoding "UTF8": 0x00

我對此進行了調查,似乎 Postgres 不喜歡文本欄位中的 NULL 字元 \00。

大多數關於此錯誤的現有線上建議都是針對看到將數據插入 Postgres 錯誤的人們。在這種情況下,修復似乎是在插入之前過濾空字元。

在這種情況下,數據似乎已經在 postgres 中,但它使視圖無法查詢。

a\d+ pg_stat_statements告訴我 pg_stat_statements 視圖是通過執行一個函式建構的,我試圖使用 translate 和 replace 擺脫字元,但沒有運氣。

知道如何使用 NULL 字元找到有問題的查詢嗎?我假設長期修復是使用 NULL 字元跟踪查詢,弄清楚它是如何進入的。

到目前為止我已經嘗試過:

  • 我通過執行SELECT pg_stat_statements_reset();. 上面的查詢會在短時間內立即生效。
  • 我做了一個\ef pg_stat_statements ,似乎第一個參數是一個名為 show text 的布爾值。傳遞 false 讓我可以查詢表,這讓我可以這樣做:
SELECT total_plan_time + total_exec_time as total_time, queryid
FROM pg_stat_statements(false)
ORDER BY total_time
DESC LIMIT 10;

不幸的是,queryid 不是很有用,除非我有辦法在沒有此錯誤的情況下檢索映射的查詢文本。

對如何進行的建議表示讚賞!我在 PostgreSQL 13.4

這一定是一個 PostgreSQL 錯誤,應該這樣報告。

我想不出比使用調試器附加到 PostgreSQL 後端並在拋出此錯誤消息的位置設置斷點更好的方法來調試它。

引用自:https://dba.stackexchange.com/questions/306293