Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Qu'est-ce que le littéral de caractère nul dans TSQL ?

Il existe deux comportements différents dans la réponse de Cade Roux :le remplacement est réussi (lorsque le classement SQL est utilisé) et échoue (le classement Windows est utilisé). La raison est dans le type de classement utilisé.

Ce comportement a été soumis à Microsoft il y a près de 4 ans :

Q : Lorsque vous essayez de remplacer un caractère NUL avec replace(), cela fonctionne si la valeur a un classement SQL, mais pas un classement Windows.

R : Cela est dû au fait que 0x0000 est un caractère indéfini dans les classements Windows. Tous les caractères indéfinis sont ignorés lors de la comparaison, du tri et de la correspondance de modèles. Ainsi, saisir "a" + char(0) revient en fait à rechercher "a", et rechercher char(0) équivaut à une chaîne vide.

La façon de gérer les caractères indéfinis est un peu déroutante, mais c'est la façon dont Windows a défini pour les trier, et SQL Server se conforme à l'API Windows générale.

Dans le classement SQL, il n'y a pas de notion de caractère indéfini. Chaque point de code se voit attribuer un poids, c'est pourquoi nous n'y voyons pas de problème.

mais malheureusement, il n'est toujours pas documenté.

Il semble donc que la seule solution consiste à changer le classement en classement SQL (par exemple, SQL_Latin1_General_CP1_CI_AS peut également être utilisé).

J'ai supprimé ma réponse précédente car inutile