【问题标题】:When use charset parameter, PDO fetchs blank spaces in fields使用 charset 参数时,PDO 获取字段中的空格
【发布时间】:2019-07-06 12:49:17
【问题描述】:

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

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

【问题讨论】:

    标签: php pdo firebird


    【解决方案1】:

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

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

    一些客户意识到这一点,并将通过将值截断为声明的长度(或技术上截断为(字节长度/每个字符的最大字节数),因为协议只传达字节长度)或其他一些措施来进行补偿(例如删除超出声明长度的空格或在最后一个非空格之后),但 PDO - 显然 - 没有。

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

    【讨论】:

    • 由于无法更改我的情况下的列类型,我决定在我的提取中使用 CAST(... AS VARCHAR(1)) 并且效果很好
    猜你喜欢
    • 2021-02-19
    • 2015-07-15
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2012-10-23
    • 2018-10-20
    • 1970-01-01
    相关资源
    最近更新 更多