答案 0 :(得分:1)
问题是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个空格。
某些客户端知道这一点,并将通过将值截断为声明的长度(或从技术上讲为(字节长度/每字节最大字节数),因为协议仅传达字节长度)进行补偿或采取其他措施(例如,删除超出声明长度的空格或最后一个非空格之后的空格),但显然PDO不会这样做。
唯一的其他解决方案是停止使用CHAR
,而改为使用VARCHAR
。