Когда используется параметр charset, PDO выбирает пустые места в полях - PullRequest
0 голосов
/ 12 февраля 2019

Когда я использую charset=utf8 для создателя PDO, некоторые поля, такие как char(1), возвращаются с таким пробелом, как этот

enter image description here

Здесь мы можемубедитесь, что это поле поддерживает только один символ

enter image description here

1 Ответ

0 голосов
/ 13 февраля 2019

Проблема в том, что CHAR дополняется пробелом до заявленной длины (в отличие от VARCHAR).При использовании набора символов подключения UTF8 ваш CHAR(1) будет преобразован в UTF8 CHAR(1).

Каждый символ в строке UTF-8 требует максимум 4 байта, поэтому для UTF8 CHAR(length) требуется максимум (длина x 4) байта.Из-за того, как UTF8 реализован в Firebird, для CHAR(1) CHARACTER SET UTF8 Firebird вернет клиенту 4-байтовое значение (в общем, он всегда будет отправлять (длина x 4) байта), ненужные байты заполняются пробелами.В результате один символ ASCII (который требует только 1 байт в UTF-8) в UTF8 CHAR(1), будет дополнен 3 пробелами.

Некоторые клиенты знают об этом и компенсируют это путем усечениязначение объявленной длины (или технически (длина байта / макс. байтов на символ), так как протокол сообщает только длину байта) или некоторая другая мера (например, удаление пробелов за объявленной длиной или после последнего непробел), но PDO - очевидно - нет.

Единственное другое решение - прекратить использовать CHAR и вместо этого использовать VARCHAR.

...