Php 当使用字符集参数时,PDO获取字段中的空格

Php 当使用字符集参数时,PDO获取字段中的空格,php,pdo,firebird,Php,Pdo,Firebird,当我在PDO creator上使用charset=utf8时,像char(1)这样的一些字段返回如下空白 在这里,我们可以看到这个字段只支持一个字符 问题是CHAR被填充到声明的长度(与VARCHAR相反)。使用连接字符集UTF8时,您的CHAR(1)将转换为UTF8CHAR(1) UTF-8字符串中的每个字符最多需要4个字节,因此UTF8CHAR(length)最多需要(length x 4)个字节。由于UTF8是如何在Firebird中实现的,对于CHAR(1)字符集UTF8,Firebi

当我在PDO creator上使用
charset=utf8
时,像
char(1)
这样的一些字段返回如下空白

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


问题是
CHAR
被填充到声明的长度(与
VARCHAR
相反)。使用连接字符集UTF8时,您的
CHAR(1)
将转换为UTF8
CHAR(1)

UTF-8字符串中的每个字符最多需要4个字节,因此UTF8
CHAR(length)
最多需要(length x 4)个字节。由于UTF8是如何在Firebird中实现的,对于
CHAR(1)字符集UTF8
,Firebird将向客户端返回一个4字节的值(通常它将始终发送(长度x 4)字节),不需要的字节用空格填充。因此,UTF8
CHAR(1)
中的单个ASCII字符(在UTF-8中仅需要1个字节)将填充3个空格

一些客户机意识到这一点,并将通过将值截断为声明的长度(或技术上截断为(字节长度/max bytes per char),因为协议只传递字节长度)或其他措施(例如删除声明长度以外的空间或最后一个非空间之后的空间)进行补偿,但PDO显然没有


唯一的另一种解决方案是停止使用
CHAR
,而是使用
VARCHAR

因为在我的案例中无法更改列类型,所以我决定在回迁时使用
CAST(…As VARCHAR(1))
,效果很好