需要帮助解决Vertica ODBC Windows VS Linux charset不匹配问题

时间:2015-02-09 15:30:17

标签: php odbc vertica

我们在使用Vertica开发PHP应用程序时遇到了一些麻烦。由于图像胜过千言万语,让我们说我们有当前的代码:

if(PHP_OS == "Linux")
    $c = new PDOVertica("Driver=/opt/vertica/lib64/libverticaodbc.so;Server=192.168.1.49;Port=5433;Database=flexgroup;", "user", "password");
else
    $c = new PDOVertica("Driver=Vertica;Server=192.168.1.49;Port=5433;Database=flexgroup;Server_CSet=UTF-8", "user", "password");

$sql = "SELECT NoClient, NomClient FROM tblclients ORDER BY NomClient";

$stmt = $c -> prepare( $sql );
$stmt -> execute();

while($res = $stmt -> fetch(PDO::FETCH_ASSOC))
{
    echo $res['NomClient'];
}

这段简单的代码几乎可以正常工作并输出我们客户的名字(如果有人好奇的话,PDOVertica类是我们为了绕过PDO丢失参数值的错误而构建的自制包装器。它调用相应的ODBC函数)。

无论如何,问题来自重音字符。为了在运行窗口的开发机器上正确输出它们,我们必须执行以下操作

echo utf8_encode($res['NomClient']);

如果生产和开发环境的工作方式相同,那么这不会成为一个问题......当然,他们不会这样做。在制作中,使用utf8_encode会使字符串变得混乱,而我们必须为相同的字符串执行此操作才能正确显示:

echo $res['NomClient'];

问题很简单:有没有人设法解决这个字符集不匹配问题?

提前致谢,

大须

编辑:为了回应sKwa,我确实在发布之前就知道了UTF-16 / UCS-2的事情。但是,我错误地认为UTF-8和UTF-16实际上是兼容的......他们不是。我犯的另一个错误是当我将页面的字符集更改为ISO-8859-1时,我惊讶地看到所有内容都神奇地显示出来。原因是ISO-8859-1和UTF-16至少与字母和数字相关(我没有检查每个可能的字符,请注意,所以我确定在某处,这两种编码会有所不同)。

1 个答案:

答案 0 :(得分:0)

在Windows上,您需要使用UTF-16(或UCS-2)而不使用UTF-8。我不确定,但我认为在Windows上它的UTF-16 BOM(取决于MS Windows版本和系统配置)

About Locales

  

数据库服务器接收的所有输入数据都应为UTF-8,HP Vertica输出的所有数据均为UTF-8。 ODBC API对Windows系统上的UCS-2中的数据进行操作,Linux系统上通常为UTF-8。