我正在从PHP、Oracle版本19和PHP 8连接到Oracle数据库,一切都很好,但我在尝试读取clob数据时遇到了问题,原则上,它们从PHP保存时没有问题,但当我尝试读取它们时,会在一些数据中产生不一致(几乎都很好(,我在clob字段中保存的是一个html文本,它有一些64编码的图像,它们通常是小图像和文本,文本加载没有问题,但有些图像(不是全部(被剪切了,我看到问题似乎是在从php读取列时,它似乎没有很好地解码字符并将它们转换成不同的字符。
另外,如果您从以下连接字符串中删除了编码,
$tns = "
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = $host)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = $db)
)
)
"
$conn = new PDO("oci:dbname=".$tns.";charset=AL32UTF8",$userdb,$password);
一切都很完美,糟糕的是文本中出现了未知的字符。我无法更改数据库的编码,因为它是客户端的一部分,包含其他数据。其代码如下:
NLS_CHARACTERSET WE8MSWIN1252
通过更改连接类型解决的问题,我喜欢使用PDO,但对于OCI,我不知道如何正确读取clob,我认为stream_get_contents在读取此类字段时存在错误。解决方案是在没有PDO的情况下使用OCI。如果您知道PDO中stream_get_contents读取clob("resource"(类型字段的替代方法,我想知道该方法。奇怪的是,系统只读取字符串,但如果您向其中添加数据类型code64,它往往会产生错误。
失败:
$result = $conn->prepare($sql);
$result->execute();
$result->bindColumn(1, $TXT_ES, PDO::PARAM_LOB);
$result->bindColumn(2, $TXT_CAT, PDO::PARAM_LOB);*/
$x = $result->fetch(PDO::FETCH_BOUND);
$json[] = array(
"TXT_ES" => stream_get_contents($TXT_ES),
"TXT_CAT" => stream_get_contents($TXT_CAT)
);
return $json;
可以使用:
$stmt = oci_parse($conOCI, $sql);
oci_execute($stmt) or die ("Unable to execute queryn");
while ( $row = oci_fetch_assoc($stmt) ) {
$json[] = array(
"TXT_ES" => $row['TXT_ES']->load()."n",
"TXT_CAT" => $row['TXT_CAT']->load()."n"
);
}
return $json;
显然,load((获取了确切的数据,stream_get_contents在编码类型上失败。测试我告诉你的内容的最好方法是保存一个完整的网页,并尝试用这两种方法阅读,如果该网页插入了代码64的图像,你会注意到最后一种方法并不完全可靠。