使用charset参数时,PDO将获取字段中的空格

时间:2019-02-12 19:32:48

标签: php pdo firebird

当我在PDO创建者上使用charset=utf8时,char(1)的某些字段会返回空白,像这样

enter image description here

在这里,我们可以看到该字段仅支持一个字符

enter image description here

1 个答案:

答案 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