Estamos usando o SQL Server 2012 com um identificador exclusivo e notamos que ao fazer seleções com caracteres adicionais adicionados ao final (portanto, não 36 caracteres), ele ainda retorna uma correspondência para um UUID.
Por exemplo:
select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8'
retorna a linha com uuid 7DA26ECB-D599-4469-91D4-F9136EC0B4E8
.
Mas se você executar:
select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'
ele também retorna a linha com o uuid 7DA26ECB-D599-4469-91D4-F9136EC0B4E8
.
O SQL Server parece ignorar todos os caracteres além de 36 ao fazer suas seleções. Isso é um bug/recurso ou algo que pode ser configurado?
Não é um problema enorme, pois temos validação no front-end para o comprimento, mas não parece um comportamento correto para mim.
O comportamento está documentado na entrada do Books Online para o
uniqueidentifier
tipo :O exemplo referido é:
Dito isto, prefiro evitar as conversões implícitas. Um
uniqueidentifier
literal pode ser digitado diretamente no T-SQL usando a sintaxe de escape ODBC:Esta é a mesma sintaxe que o SQL Server usa internamente em planos de execução ao dobrar constantemente uma representação de string para um typed
uniqueidentifier
:Se você pode passar digitado
uniqueidentifiers
de e para o SQL Server pode depender da biblioteca que está usando, mas strings de 36 caracteres me parece a menos desejável das opções disponíveis. Se você precisar realizar conversões, torne-as explícitas e use um valor binário de 16 bytes em vez de uma string.Os caracteres adicionais são simplesmente ignorados (bem, silenciosamente truncados) pelo SQL Server durante a conversão implícita. Por exemplo:
Resultado:
Isso não é diferente deste cenário:
Resultado:
Você não pode configurar isso, mas se quiser que sua variável falhe na conversão, tente inserir a variável em uma tabela
CHAR(36)
primeiro, o que falhará devido ao truncamento:Resultado:
A conversão implícita também funciona se o valor estiver entre chaves
{...}
.Se você adicioná-los na consulta, a conversão implícita falhará se o valor original for muito longo porque o último
}
acaba no lugar errado.Se você tentar converter
você consegue