PHP将MSSQL存储过程中的空字符串转换为空字符串
简化示例 这在存储过程中PHP将MSSQL存储过程中的空字符串转换为空字符串,php,sql,sql-server,sql-server-2008,Php,Sql,Sql Server,Sql Server 2008,简化示例 这在存储过程中 select coalesce('(' + phone + ') ', '(' + number + ') ' from example_table 所以,若phone不为NULL,我将返回(phone),否则我将返回(number) 这是因为MSSQL被配置为CONCAT_NULL_YIELDS_NULL,基本上如果CONCAT中有NULL,那么所有内容都将变为NULL 当我从客户端(SQLPro)运行它时,它会按预期工作 当我从PHP代码调用这个SP时,只有当ph
select coalesce('(' + phone + ') ', '(' + number + ') '
from example_table
所以,若phone不为NULL,我将返回(phone),否则我将返回(number)
这是因为MSSQL被配置为CONCAT_NULL_YIELDS_NULL,基本上如果CONCAT中有NULL,那么所有内容都将变为NULL
当我从客户端(SQLPro)运行它时,它会按预期工作
当我从PHP代码调用这个SP时,只有当phone的值为NULL时,我才得到这个()括号,并且读取它时,PHP似乎将NULL转换为空字符串
有人知道如何避开这个问题吗?可能php.ini中的配置会强制php将空值视为特殊值NULL,而不是将其转换为空字符串?只需将表达式更改为不依赖于配置的内容:
select '(' + coalesce(phone, number) + ') '
from example_table;
如果有更复杂的表达式,则可能需要使用显式的大小写
:
select (case when phone is not null then '(' + phone + ') '
else '(' + number + ') '
end)
当然,第一个版本更简单,但这可能更具普遍性。这是有道理的。不幸的是,这是一个正在迁移到AWS的遗留系统,因此需要更改几十个存储过程。然而,经过进一步的调查,我发现了这个问题,结果证明PHP与此无关。事实证明,新DB的CONCAT_NULL_YIELDS_NULL默认为on,这与预期一致,但随后该属性被AWS覆盖并关闭。