PHP 将 NULL 转换为 MSSQL 存储过程中的空字符串
Posted
技术标签:
【中文标题】PHP 将 NULL 转换为 MSSQL 存储过程中的空字符串【英文标题】:PHP translates NULL to empty strings in MSSQL stored procedures 【发布时间】:2016-09-29 01:47:15 【问题描述】:简化示例 这是在存储过程中
select coalesce('(' + phone + ') ', '(' + number + ') '
from example_table
所以如果电话不为 NULL,我会返回(电话),否则我会返回(号码)。
原因是MSSQL被配置为CONCAT_NULL_YIELDS_NULL,基本上如果concat中有NULL一切都变成NULL了。
当我从客户端 (SQLPro) 运行它时,它按预期工作
当我从 php 代码中调用这个 SP 时,只有当 phone 的值为 NULL 时,我才会得到这个 () 括号,并且阅读它似乎 PHP 将 NULL 转换为空字符串。
有人知道解决这个问题的方法吗?也许 php.ini 中的配置会强制 PHP 将 NULL 值视为特殊值 NULL 而不是将它们转换为空字符串?
【问题讨论】:
【参考方案1】:只需将表达式更改为不依赖于配置的内容即可:
select '(' + coalesce(phone, number) + ') '
from example_table;
如果您有更复杂的表达式,那么您可能需要使用显式的case
:
select (case when phone is not null then '(' + phone + ') '
else '(' + number + ') '
end)
当然,第一个版本更简单,但这可能更通用。
【讨论】:
这是有道理的。不幸的是,这是一个正在迁移到 AWS 的遗留系统,因此需要更改数十个存储过程。然而,经过一些进一步的调查,我发现了这个问题,事实证明 PHP 与它无关。事实证明,新数据库的 CONCAT_NULL_YIELDS_NULL 按预期默认为打开,但随后该属性被 AWS 覆盖并关闭。以上是关于PHP 将 NULL 转换为 MSSQL 存储过程中的空字符串的主要内容,如果未能解决你的问题,请参考以下文章
使用 SQL Server 2012 中的 MSSQL_Query 的 PHP 调用存储过程返回无效值
PHP 7和MSSQL PDO:使用输入和输出参数调用存储过程