我在 PHP 中有一个 $string 。这来自哪里并不重要(它来自传入的电子邮件);重要的是,有时,根据 PostgreSQL,它不是有效的 UTF-8,但根据 PHP ,它是有效的。
我明确设置了 mb_internal_encoding('UTF-8') 和 mb_regex_encoding('UTF-8')。在建立 PostgreSQL 数据库连接时,我将 client_encoding 显式设置为“UTF8”(是的,它希望它没有“-”)。我一遍又一遍地验证 PG 数据库本身使用 UTF8。简而言之:我系统上的所有内容都使用 UTF-8 编码。
详细信息:PHP 7.4.1。PG 11.5。Windows 10。(对于 PHP/PG/Windows 的许多版本,同样的事情已经发生了很多年。)
在尝试插入包含 $string 的记录之前,我进行了以下完整性/安全性检查以避免错误:
function string_is_valid_UTF8($string)
{
if (!mb_check_encoding($string, 'UTF-8'))
return false;
else
return true;
}
if (string_is_valid_UTF8($string))
// Proceed to INSERT it into the database since PHP says it's valid UTF-8 data.
偶尔——不是每次!-- PostgreSQL 对此嗤之以鼻,尽管 PHP 已检查它是有效的 UTF-8。它吐出/记录此错误:
pg_query_params(): Query failed: ERROR: invalid byte sequence for encoding "UTF8"
我不明白。我能看到的唯一解释是 PostgreSQL 和 PHP 对什么是有效的 UTF-8 有不同的想法。这个问题困扰了我多年,但我似乎永远无法解决它。一次又一次,有时在几周或几个月之间,一些外部数据进入我的系统会导致这个问题。尽管我的检查!
有什么我可以告诉 PostgreSQL 让它以不同的方式处理这个问题的吗?我不希望记录该错误。真的,真的很烦。
在这一点上,我完全不知道这是怎么发生的。PHP 或 PostgreSQL 错了吗?考虑到我已经处理了多少次并试图通过无数种不同的方法来解决它,在这一点上我做错了什么似乎是不合理的。