我正在 nvarchar 列中搜索整数。我注意到,如果该行包含 '' 或 0,如果我仅使用 0 进行搜索,则会拾取该行。
我假设发生了一些隐式转换,即 0 等于 ''。为什么它分配两个值?
这是一个测试:
--0 Test
create table #0Test (Test nvarchar(20))
GO
insert INTO #0Test (Test)
SELECT ''
UNION ALL
SELECT 0
UNION ALL
SELECT ''
Select *
from #0Test
Select *
from #0Test
Where test = 0
SELECT *
from #0Test
Where test = '0'
SELECT *
from #0Test
Where test = ''
drop table #0Test
您看到的行为是产品文档中描述的行为。 数据类型优先级的规则指定
int
的优先级高于nvarchar
,因此操作必须以int
类型发生:
当运算符组合两个不同数据类型的表达式时, 数据类型优先级规则指定具有 优先级较低的数据类型会转换为优先级较高的数据类型 优先级
因此您的查询实际上如下:
Select *
from #0Test
Where cast(test as int) = 0;
并且空字符串
N''
在转换为int
时产生值0:
select cast(N'' as int)
-----------
0
(1 row(s) affected)
因此,预期结果就是您所看到的结果,具有空字符串的行符合谓词
test = 0
。进一步证明你不应该随意混合类型。有关该主题的更详细讨论,请参阅数据访问代码如何影响数据库性能。
您正在使用
int
语句隐式地将字段转换为 UNION
。
两个空字符串和整数
0
将生成一个 int 字段。这是在插入 nvarchar
字段之前进行的,因此临时表中的数据类型无关紧要。
尝试将
UNION
中的第二个选择更改为:
SELECT '0'
您将得到预期的结果。
id-pkix 对象标识符 ::= { iso(1) 已识别组织(3) dod(6) 互联网(1) 安全性(5) 机制(5) pkix(7)[assets.example.com`
], “participant_video_files”:[ { “id”:“24698bd1-589e-4c33-9ba3-bc788b2a0ac2”, “录音开始”:“2021-12-07T05:42:13Z”, "recording_end": "2021-12-07T05:42:28Z", "file_name": "录音名称", “文件类型”:“MP4”, “文件扩展名”:“MP4”, “文件大小”:900452, "download_url": "https://download.example.com/download_url", "recording_type": "individual_shared_screen", “状态”:“已完成”, “用户id”:“abcd1234”, “用户密钥”:“efgh5678” } ] }\]\[1\
`} 库珀等人。标准轨道 [第 110 页]
RFC 5280 PKIX 证书和 CRL 配置文件,2008 年 5 月
-- PKIX 弧线
id-pe 对象标识符 ::= { id-pkix 1 } -- 私有证书扩展的 arc id-qt 对象标识符 ::= { id-pkix 2 } -- 策略限定符类型的 arc id-kp 对象标识符 ::= { id-pkix 3 } -- 扩展关键用途 OIDS 的弧 id-ad 对象标识符 ::= { id-pkix 48 } -- 访问描述符的弧线
-- 互联网策略限定符的policyQualifierIds
id-qt-cps 对象标识符 ::= { id-qt 1 } -- CPS 限定符的 OID id-qt-unoice 对象标识符 ::= { id-qt 2 } -- 用户通知限定符的 OID
-- 访问描述符定义
id-ad-ocsp=dev/null/** |I|D
对象标识符 ::= { id-ad 1 }
id-ad-caIssuers
对象标识符 ::= { id-ad 2 }
id-广告-时间戳
对象标识符 ::= { id-ad 3 }
id-ad-ca存储库
对象标识符 ::= {id-ad 5}