首页 > 解决方案 > PHP 上 SAP HANA UTF8 的最后一个字符问题

问题描述

由于某种原因,UTF8 字符串的最后一个字符被弄乱了,但仅在 linux 上。在 Windows 上工作得很好。这是代码:

<?php
header('Content-type: text/plain;Charset=UTF-8;');
$datasource = 'DRIVER=/usr/sap/hdbclient/libodbcHDB.so;SERVERNODE=myserver:30041;CHAR_AS_UTF8=TRUE;';
$username   = "myuser";
$password   = "mypass";

$conn   = odbc_connect($datasource, $username, $password, SQL_CUR_USE_ODBC);

if (!($conn)) {
    exit("Connection Failed: " . $conn);
} 
else {
    $sql = 'select * from sltschema.t141t';
    $rs  = odbc_exec($conn,$sql);
    if (!$rs) {
        exit("Error in SQL");
    }       
    while ($rec=(array)odbc_fetch_array($rs)) {
        echo json_encode($rec).PHP_EOL;
        break;
    }
    odbc_close($conn);
}
?>

这是我的 CENTOS Linux 机器上的结果(注意 MTSTB 中的最后一个字符)

{
MANDT: "000",
SPRAS: "1",
MMSTA: "01",
MTSTB: "因采购/仓库而被冻hp",
ZMODIFIEDTS: "20200120110440737"
}

这是我的 Windows Box 上的结果(仅在数据源中更改了 DRIVER={HDBODBC})

{
MANDT: "000",
SPRAS: "1",
MMSTA: "01",
MTSTB: "因采购/仓库而被冻结",
ZMODIFIEDTS: "20200120110440737"
}

所以不知何故,只有最后一个字符被搞砸了。

有什么建议么?

PS:我正在使用版本 2.4.182.1579711187 的 HDBclient 驱动程序,并尝试过版本 2.0.62.1478878744 有同样的问题。

标签: phputf-8saphanaunixodbc

解决方案


我就此向 PHP.net 提交了一个错误: https ://bugs.php.net/bug.php?id=79217

我还发现了另一个有趣的信息:我正在查询的字段在 HANA 中设置为 nvarchar(25)。如果我将它转换为 nvarchar(50) 它可以工作。

测试查询:

select cast(mtstb as nvarchar(50)) mtstb  from sltschema.t141t

结果:

Mtstb
因采购/仓库而被冻结
因任务清单/BOM而被冻结
MPN:BOM抬头冻结
gesp. für Besch./Lager
gesp. für Arb.plan/Stückl

推荐阅读