1

这是我用来从 InterBase 数据库中获取一些数据的简单代码:

<?php
$host = 'localhost:C:/ME/DB/test.GDB';
$username='SYSDBA';
$password='*******';

if (!($dbh=ibase_connect($host, $username, $password, 'ISO8859_1', 0, 1)))
    die('Could not connect: ' .  ibase_errmsg());

$stmt = 'SELECT * FROM DB where CODE >= 4400';

$sth = ibase_query($dbh, $stmt);
$letters = array();
while ($row = ibase_fetch_assoc($sth)) {
    echo $row['CODE'] . ' ';
}

ibase_free_result($sth);
ibase_close($dbh);
?>

该代码在 Windows 7 上运行良好,但在 XP 上(这是代码在生产中应该运行的地方),它返回以下错误:

ibase_fetch_assoc():算术异常、数值溢出或字符串截断无法在字符集之间音译字符

任何人都知道如何使它工作?

PS这里的文档说http://www.php.net/manual/en/function.ibase-query.php

如果您在使用此功能时以及在 ibase_query() 之后收到一些错误,例如“算术异常、数字溢出或字符串截断。无法在字符集之间转写字符”(当您尝试使用带有重音符号的字符时会发生这种情况),您必须设置字符集(即 ISO8859_1 或您当前的字符集)。

这是我的解决方案吗?如果是我应该如何设置字符集?

4

1 回答 1

2

您需要在 ibase 会话中设置正确的字符集。如果没有设置 php 遵循默认值。由于您已经设置了字符集,因此数据库中的数据可能作为 ISO-8859-1 无效。

连接到数据库时,将字符集设置为 ibase_connect 中的第四个参数。您要么必须设置“正确”字符集,要么在某些情况下可以使用字符集“NONE”,如果使用“NONE”,则不会进行任何字符转换并使用或多或少的原始数据。

尝试连接:

if (!($dbh=ibase_connect($host, $username, $password, 'NONE', 0, 1)))
    die('Could not connect: ' .  ibase_errmsg());
于 2013-04-30T09:22:30.373 回答