Проблема в том, что 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
.