使用charset参数时,PDO会在字段中获取空格

问题描述 投票:1回答:1

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

enter image description here

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

enter image description here

php pdo firebird
1个回答
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个空格。

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

唯一的其他解决方案是停止使用CHAR而是使用VARCHAR

© www.soinside.com 2019 - 2024. All rights reserved.