Postgresql
錯誤:用於編碼“UTF8”的無效字節序列:pg_stat_statements 中的 0x00
我正在嘗試使用 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 後端並在拋出此錯誤消息的位置設置斷點更好的方法來調試它。