Php 如何使Oracle保留查询中出现的标识符的大小写?
我想使用一个使用PDO的php库。我想使用一个Oracle数据库 问题是该库的作者在查询中使用了不带引号的标识符,例如:Php 如何使Oracle保留查询中出现的标识符的大小写?,php,oracle,pdo,case-sensitive,Php,Oracle,Pdo,Case Sensitive,我想使用一个使用PDO的php库。我想使用一个Oracle数据库 问题是该库的作者在查询中使用了不带引号的标识符,例如: $statement=$pdo->prepare('SELECT*from some_table,其中some_column=:some_column'); $statement->execute(['some_column'=>'some value']); $result=$statement->fetch(\PDO:fetch\u ASSOC); 返回$result['
$statement=$pdo->prepare('SELECT*from some_table,其中some_column=:some_column');
$statement->execute(['some_column'=>'some value']);
$result=$statement->fetch(\PDO:fetch\u ASSOC);
返回$result['some_other_column'];
在本例中,Oracle将标识符的大小写转换为大写,但作者假定大小写为小写,因此会出现未定义索引
php错误
我如何绕过这个
UPD。我尝试在创建数据库对象时使用小写,例如:
创建表格“一些表格”
(
“some_column”VARCHAR(10),
“some_other_column”VARCHAR(10)
);
-但是在这种情况下,Oracle在执行上面的SELECT
语句时会引发一个错误,因为其中的标识符转换为大写,而对象名转换为小写
UPD2
我不应该编辑第三方库的源代码-必须以某种方式配置我的环境和连接:Oracle、PHP、PDO。如果您想使用小写标识符,那么,正如您在问题中所写的,您需要在Oracle中对它们进行双引号:
创建表格“一些表格”
(
“some_column”VARCHAR(10),
“some_other_column”VARCHAR(10)
);
如果您使用了区分大小写的标识符,则每次使用时都需要引用它们。因此,PHP中的SQL语句应该是:
$statement=$pdo->prepare('SELECT*自“some_table”,其中“some_column”=:some_column');
一旦在那里引用了它们,那么标识符将与数据库中的值匹配,并且返回的结果集也应该具有小写的列标识符
我如何绕过这个
从Oracle的文档中:
数据库对象命名规则
每个数据库对象都有一个名称。在SQL语句中,使用带引号的标识符或不带引号的标识符表示对象的名称
- 带引号的标识符以双引号(“)开头和结尾。如果使用带引号的标识符命名架构对象,则无论何时引用该对象,都必须使用双引号
- 不带引号的标识符不被任何标点符号包围
这意味着您不能在Oracle中绕过这一点,因为这是Oracle设计的行为方式并且可以有小写标识符,否则Oracle会将不带引号的标识符隐式转换为大写。多亏了
您的常识的评论,我找到了一个解决方案
初始化库时,我向它传递一个PDO对象-我已通过以下代码将其配置为始终使用小写:
$options=[
PDO::ATTR_CASE=>PDO::CASE_LOWER,
];
$connection=newpdo($dsn、$username、$password、$options);
init3rdPartyLibrary($connection);
因此,$statement->fetch()返回的$result
变量的键
现在是小写的,因此该库可以按照作者的预期工作。我不懂PHP,但是-就Oracle而言-如果您想保留字母大小写,请将这些标识符括在双引号中。看看是否有帮助。@Littlefoot如果我不是该库的开发人员,我该怎么做?您是否建议覆盖他们的在他们使用SQL查询的每个地方编写代码?嗯,不。正如我所说,我不懂PHP,我不知道它实际上是如何工作的。我希望其他人能够提供帮助。@YourCommonSense,IMO,pdo已经使用了case_natural-这就是为什么它以大写形式返回结果的原因。但你给了我一个好主意-我将尝试强制它使用小写(因为图书馆的作者使用小写)-也许会有帮助