问题是CHAR
是空间填充到声明的长度(与VARCHAR
相反)。当您使用连接字符集UTF8时,您的CHAR(1)
将转换为UTF8 CHAR(1)
。
UTF-8字符串中的每个字符最多需要4个字节,因此UTF8 CHAR(length)
最多需要(长度x 4)个字节。由于在Firebird中如何实现UTF8,对于CHAR(1) CHARACTER SET UTF8
,Firebird将向客户端返回一个4字节值(通常它将始终发送(长度x 4)字节),不需要的字节用空格填充。因此,在UTF8 CHAR(1)
中,单个ASCII字符(在UTF-8中只需要1个字节)将填充3个空格。
一些客户端意识到这一点,并通过将值截断为声明的长度(或技术上为(byte-length / max-bytes-per-char)来补偿,因为协议只传递字节长度)或其他一些措施(例如删除超出声明长度或在最后一个非空间之后的空间),但PDO - 显然 - 没有。
唯一的其他解决方案是停止使用CHAR
而是使用VARCHAR
。