У меня есть строка $ в PHP. Неважно, откуда это (это из входящих писем); важная часть в том, что иногда, это не действительно UTF-8 в соответствии с PostgreSQL, но является действительным в соответствии с PHP.
Я явно установил оба mb_internal_encoding ('UTF-8') и mb_regex_encoding ('UTF-8'). Я явно устанавливаю client_encoding в 'UTF8' (да, он хочет это без '-') при установлении соединения с базой данных PostgreSQL. Я снова и снова проверял, что сама база данных 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 неправильно? Учитывая, сколько раз я сталкивался с этим и пытался решить его миллионами разных методов, не кажется разумным, что я сейчас что-то делаю не так.