Php 当使用字符集参数时,PDO获取字段中的空格
当我在PDO creator上使用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
charset=utf8
时,像char(1)
这样的一些字段返回如下空白
在这里,我们可以看到这个字段只支持一个字符
问题是
CHAR
被填充到声明的长度(与VARCHAR
相反)。使用连接字符集UTF8时,您的CHAR(1)
将转换为UTF8CHAR(1)
UTF-8字符串中的每个字符最多需要4个字节,因此UTF8CHAR(length)
最多需要(length x 4)个字节。由于UTF8是如何在Firebird中实现的,对于CHAR(1)字符集UTF8
,Firebird将向客户端返回一个4字节的值(通常它将始终发送(长度x 4)字节),不需要的字节用空格填充。因此,UTF8CHAR(1)
中的单个ASCII字符(在UTF-8中仅需要1个字节)将填充3个空格
一些客户机意识到这一点,并将通过将值截断为声明的长度(或技术上截断为(字节长度/max bytes per char),因为协议只传递字节长度)或其他措施(例如删除声明长度以外的空间或最后一个非空间之后的空间)进行补偿,但PDO显然没有
唯一的另一种解决方案是停止使用
CHAR
,而是使用VARCHAR
因为在我的案例中无法更改列类型,所以我决定在回迁时使用CAST(…As VARCHAR(1))
,效果很好