我们正在使用带有唯一标识符的SQL Server 2012,我们注意到在选择时添加了额外的字符(因此不是36个字符),它仍会返回与UUID的匹配.
例如:
select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8'
使用uuid 7DA26ECB-D599-4469-91D4-F9136EC0B4E8返回行.
但如果你跑:
select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'
它还返回带有uuid 7DA26ECB-D599-4469-91D4-F9136EC0B4E8的行.
在执行选择时,SQL Server似乎忽略了36以外的所有字符.这是一个错误/功能还是可以配置的东西?
这不是一个大问题,因为我们在前端验证了长度,但对我来说这似乎不正确.
解决方法
如果值包含在大括号{…}中,则隐式转换也有效.
如果在查询中添加那些隐式转换,如果原始值太长,则隐式转换将失败,因为最后一个}在错误的位置结束.
select * from some_table where uuid = '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8'+'}'
如果你尝试转换
SELECT CONVERT(UNIQUEIDENTIFIER,'{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'+'}');
你得到
Msg 8169,Level 16,State 2,Line 1 Conversion failed when converting from a character string to uniqueidentifier.