Почему PHP и PostgreSQL имеют совершенно разные представления о том, что является действительным UTF-8? - PullRequest
0 голосов
/ 10 января 2020

У меня есть строка $ в 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 неправильно? Учитывая, сколько раз я сталкивался с этим и пытался решить его миллионами разных методов, не кажется разумным, что я сейчас что-то делаю не так.

...