使用 Oracle、PHP 和 Oci8 处理尖锐字符和其他特殊字符

2023-12-27

您好,我正在尝试将名称存储到 Oracle 数据库中并使用 PHP 和 oci8 取回它们。

但是,如果我插入é直接进入 Oracle 数据库并使用 oci8 将其取回 我刚刚收到e

我是否必须对所有特殊字符(包括é)转换为 html 实体(即:é)在插入数据库之前...或者我错过了什么?

Thx


更新:3 月 1 日 18:40

发现这个函数:http://www.php.net/manual/en/function.utf8-decode.php#85034 http://www.php.net/manual/en/function.utf8-decode.php#85034

function charset_decode_utf_8($string) {
    if(@!ereg("[\200-\237]",$string) && @!ereg("[\241-\377]",$string)) {
        return $string;
    }
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e","'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",$string);
$string = preg_replace("/([\300-\337])([\200-\277])/e","'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",$string);
return $string;
}

似乎有效,但不确定它是否是最佳解决方案


更新:3 月 8 日 15:45

Oracle 的字符集是 ISO-8859-1。
在 PHP 中我添加了:

putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");

强制 oci8 连接使用该字符集。 检索é现在可以使用 PHP 中的 oci8 了! (为了varchars, 但不是CLOBs不得不做utf8_encode提取它)
然后我尝试将数据从 PHP 保存到 Oracle...但它不起作用...从 PHP 到 Oracle 的某个地方é成为一个?


更新:3 月 9 日 14:47

于是越来越近。 添加 NLS_LANG 变量后,直接进行 oci8 插入é works.

问题实际上出在PHP方面。 通过使用 ExtJs 框架,在提交表单时,它使用以下方式对其进行编码encodeURIComponent.
So é发送为%C3%A9然后重新编码为é.
然而它现在的长度是2 (strlen($my_sent_value) = 2)而不是 1。 如果在 PHP 中我尝试: $my_sent_value ==é = FALSE

我认为如果我能够将 PHP 中的所有这些字符重新编码回字节大小 1 的长度,然后将它们插入到 Oracle 中,它应该可以工作。

但仍然没有运气


更新:3 月 10 日 11:05

我一直认为我是如此接近(却又如此遥远)。

putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");工作非常零星。

我创建了一个小的 php 脚本来测试:

header('Content-Type: text/plain; charset=ISO-8859-1');
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");
$conn= oci_connect("user", "pass", "DB");
$stmt = oci_parse($conn, "UPDATE temp_tb SET string_field = '|é|'");
oci_execute($stmt, OCI_COMMIT_ON_SUCCESS);

运行一次并直接登录 Oracle 数据库后,我看到 STRING FIELD 设置为|¿|。显然这不是我从之前的经历中所期望的。
但是,如果我快速刷新该 PHP 页面两次......它就有效了!
在Oracle中我正确地看到了|é|.

看起来环境变量可能没有在第一次执行脚本时正确设置或发送,但可用于第二次执行。

我的下一个实验是将变量导出到 PHP 的环境中,但是,我需要为此重置 Apache...所以我们将看看会发生什么,希望它能起作用。


我想您已经了解这些事实:

  • 有许多不同的字符集:您必须选择一种,当然,还要知道您正在使用哪一种。
  • Oracle 完全能够存储没有 HTML 实体的文本(é)。 HTML 实体用在 HTML 中。 Oracle 不是 Web 浏览器;-)

您还必须知道 HTML 实体不绑定到特定的字符集;相反,它们用于表示独立于字符集的上下文中的字符。

你含糊其辞地谈论ISO-8859-1和UTF-8。您想使用什么字符集? ISO-8859-1 易于使用,但它只能存储某些拉丁语言(例如西班牙语)的文本,并且缺少一些常见字符,例如 € 符号。 UTF-8 使用起来比较棘手,但它可以存储 Unicode 联盟定义的所有字符(其中包括您需要的所有字符)。

一旦做出决定,您必须将 Oracle 配置为以此类字符集保存数据并选择适当的列类型。例如,VARCHAR2 适用于纯 ASCII,NVARCHAR2 适用于 UTF-8。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Oracle、PHP 和 Oci8 处理尖锐字符和其他特殊字符 的相关文章

  • SplFileObject + LimitIterator + 偏移量

    我有两行数据文件 两行仅用于我的示例 实际上 该文件可以包含数百万行 并且我使用 SplFileObject 和 LimitIterator 进行偏移 但这种组合在某些情况下会有奇怪的行为 offset 0 file new SplFile
  • 从 PHP 中的平面路径数组构建目录树

    所以 标题可能令人困惑 但我不知道如何表达这种数组结构 它肯定是一个树结构 但至于它的创建 这正是我所渴望的 它似乎不遵循典型的递归数组树构建 我正在尝试从平面路径数组创建列目录布局 每个路径都位于其自己的多维数组内 该数组旨在构建 mac
  • 如何在代码输出中显示 PHP 错误?

    当通过浏览器执行PHP页面时 我们只会得到输出 但不会得到代码中的错误 如何查看后端代码发生的错误 我在代码中使用以下内容进行错误报告 error reporting E ALL E ALL ini set display errors 1
  • file_get_contents 获取 php 内容!我需要 html 中的源代码

    我正在尝试使用 file get contents 获取 php 文件的 html 内容 但我无法管理它 无论我做什么 它都需要 php 内容 所以我希望您理解并可以帮助我 脚本的代码
  • 在 csv 中查找数值

    我需要检查特定的数字 ID 是否在给定的字符串或逗号分隔值中 myVal 20 字符串可以仅包含多个值中的一个值 以逗号分隔 str 20 str 20 33 5 str 220 33 5 4420 本来我想到用strpos 但是20可以在
  • 使用 PHPUnit 模拟对象是否有可能期望调用神奇的 __call() 方法?

    我在测试中有一个模拟对象 真实的对象 PageRepository 使用 call 实现了一个神奇的方法 因此如果您调用 pageRepository gt findOneByXXXX value of field XXXX 它将在数据库中
  • 如何读取数据库文件并应用不同的解码?

    我有一个 dbf 文件结束编码为 866 代码页 DOS 使用下面的代码 我正在尝试阅读它 问题是我得到的字符串的形成方式就好像文件位于代码页 1252 中一样 我已经检查过 SO 和其他论坛上的其他问题 到目前为止还没有运气 寻找有关热门
  • 如何从 PHP 访问表单的“名称”变量

    我正在尝试创建一个 BMI 计算器 这应该允许人们使用公制或英制测量单位 我意识到我可以使用隐藏标签来解决我的问题 但这之前曾困扰过我 所以我想我会问 我可以使用 POST variableName 查找提交的变量名字段值 但是 我不知道或
  • Maven UTF-8编码问题

    当我使用两个不同的项目运行下面的代码时 我得到不同的输出 String myString T rk e Karakter Testi i String value new String myString getBytes UTF 8 Sys
  • 如何在使用 echo 时将字符串与函数调用连接起来?

    我想在我的 echo ed html 字符串中使用两个函数调用返回的值 li a href the permalink the title a li 以下工作正常 echo li a href echo the title echo a l
  • 550 Bad HELO - 主机冒充域名 Laravel

    我正在尝试设置 Laravel 身份验证 包括 密码重置 功能 但当我尝试发送电子邮件时 我偶然发现了一个错误 我得到的错误是 Expected response code 250 but got code 550 with message
  • 如何复制具有 MySQL 中保留的键和其他结构特征的表?

    如何复制保留键和其他结构特征的表 包括主键 外键和索引 这可以通过单个 MySQL 查询来完成吗 我正在使用 create table newtable as select 但此方法会使所有键和索引丢失 无法使用单个查询来从另一个表复制一个
  • Wordpress 编辑器中的“application/gas-events-abn”对象是什么?

    我正在使用 Wordpress 创建博客 我注意到当我多次保存帖子时 代码中会出现一个奇怪的元素 在帖子底部创建一个大的空白区域 代码如下所示 post content nbsp 每次我编辑帖子时 我都必须将其删除 Joomla 有时也会发
  • Preg_split 用逗号,忽略括号,PHP

    我必须分割一个字符串 并且我想避免用括号内的逗号分割它 那么我该如何实现呢 Example string string1 sString1 sString2 ssString1 ssString2 string2 string3 resul
  • Php mod_rewrite 无法正常工作

    我有一个带有以下链接结构的 php 页面 http localhost wisper businesspage php profile creativeartbd 所以我尝试将此链接转换为以下样式 http localhost wisper
  • PHP 中的舍入

    a 0 1 0 7 10 int 0 1 0 7 10 PHP 返回 false 有人能给我解释一下 为什么会发生这种情况吗 第一个返回 8 第二个返回 7 引用PHP 浮点精度手册中的大红色警告 http de3 php net manu
  • 如何在oracle sql查询中提取括号之间的字符串

    我正在尝试从字符串中提取括号之间的值 我怎样才能做到这一点 例如 我有这个字符串 Gupta Abha 01792 我想得到括号之间的结果 即 01792 我正在尝试编写这样的查询 select substr Gupta Abha 0179
  • PHP/MySQL - 在数据库中存储数组

    我正在开发一个 PHP 应用程序 它需要将各种设置存储在数据库中 客户经常询问是否可以添加或更改 删除某些内容 这导致了表格设计出现问题 基本上 我有很多布尔字段 它们只是指示是否为特定记录启用了各种设置 为了避免再弄乱表格 我正在考虑将数
  • Codeigniter,为MySQL创建表和用户

    我想以编程方式使用 CI 创建数据库和用户 到目前为止 我有这 2 个简单的 MySQL 语句 CREATE DATABASE testdb DEFAULT CHARACTER SET utf8 COLLATE utf8 general c
  • 以零开头的字符串/数字的正确格式?

    我正在尝试使用 PHP 创建一个包含电话号码列表的文件 它工作正常 但如果电话号码以零开头 则该数字将从 Excel 文件中删除 有谁知道如何正确设置格式以使其保持不变 Either Set the value explicitly as

随机推荐