为什么PHP和PostgreSQL对什么是有效的UTF-8有着截然不同的看法?

为什么PHP和PostgreSQL对什么是有效的UTF-8有着截然不同的看法?,php,postgresql,unicode,utf-8,pg-query,Php,Postgresql,Unicode,Utf 8,Pg Query,我在PHP中有一个$string。不管这是从哪里来的(它来自于收到的电子邮件);重要的是,有时,根据PostgreSQL,UTF-8无效,但根据PHP,有效 我显式地设置了mb_内部编码(“UTF-8”)和mb_正则表达式编码(“UTF-8”)。在建立PostgreSQL数据库连接时,我显式地将client_encoding设置为“UTF8”(是的,它希望它不带“-”)。我已经反复验证PG数据库本身是否使用UTF8。简而言之:我的系统上的所有东西都使用UTF-8编码 详细信息:PHP7.4.1。

我在PHP中有一个$string。不管这是从哪里来的(它来自于收到的电子邮件);重要的是,有时,根据PostgreSQL,UTF-8无效,但根据PHP,有效

我显式地设置了mb_内部编码(“UTF-8”)和mb_正则表达式编码(“UTF-8”)。在建立PostgreSQL数据库连接时,我显式地将client_encoding设置为“UTF8”(是的,它希望它不带“-”)。我已经反复验证PG数据库本身是否使用UTF8。简而言之:我的系统上的所有东西都使用UTF-8编码

详细信息:PHP7.4.1。第11.5页。视窗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是错误的吗?考虑到我已经处理了多少次这个问题,并试图用无数种不同的方法来解决它,我在这一点上做错了什么似乎是不合理的。

输出查询并在postgres中执行,它有效吗?可能字符串被截断了。for
mb\u check\u encoding()
上的一条注释可能会对这个问题产生一些影响:“此函数不检查错误的字节序列,它只检查字节流是否有效。”@MagnusEriksson I一定缺少什么。好的,这个函数没有正确编码。那么哪一个是?如何实际检查字符串是否实际有效UTF-8?也就是说,没有“坏字节序列”。我在搜索时发现的任何线程都会反复忽略这个问题的答案。您写道:“不是每次!”。你是说当输入相同的数据时,这种情况偶尔会发生吗?或者,你的意思是,偶尔会在发生这种情况的地方得到输入数据。如果是,输入数据是什么?使其可复制。这是找出发生了什么的唯一方法。@climp自然地,我的意思是它“偶尔”发生,就像在不同的输入数据中一样。尽管计算机有缺陷和怪异,但它们只是用相同的逻辑和输入回答不同而已!(当然,除非它是故意随机生成的。)至于确切的输入数据,我不保存它,所以我不能显示它,但为什么您需要它?它只是无效的UTF-8,这就是我想要检测的。为什么没有人明白我的要求?