Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was ist das Nullzeichen-Literal in TSQL?

In der Antwort von Cade Roux gibt es zwei verschiedene Verhaltensweisen:Die Ersetzung ist erfolgreich (bei Verwendung der SQL-Sortierung) und nicht erfolgreich (bei Verwendung der Windows-Sortierung). Der Grund liegt in der Art der verwendeten Sortierung.

Dieses Verhalten wurde Microsoft vor fast 4 Jahren gemeldet:

F: Wenn Sie versuchen, ein NUL-Zeichen mit replace() zu ersetzen, funktioniert dies, wenn der Wert eine SQL-Kollatierung hat, aber keine Windows-Kollatierung.

A: Dies liegt daran, dass 0x0000 ein undefiniertes Zeichen in Windowscollations ist. Alle undefinierten Zeichen werden beim Vergleich, Sortieren und Mustervergleich ignoriert. Die Suche nach „a“ + Zeichen(0) ist also wirklich eine Suche nach „a“, und die Suche nach Zeichen(0) entspricht einer leeren Zeichenfolge.

Die Art und Weise, undefinierte Zeichen zu handhaben, ist etwas verwirrend, aber dies ist die Art und Weise, die Windows definiert hat, um sie zu sortieren, und SQL Server entspricht der allgemeinen Windows-API.

Bei der SQL-Sortierung gibt es keine Vorstellung von undefinierten Zeichen. Jedem Codepunkt ist eine Gewichtung zugeordnet, deshalb sehen wir darin kein Problem.

aber leider ist es immer noch undokumentiert.

Die einzige Lösung scheint also darin zu bestehen, die Sortierung in eine SQL-Sortierung zu ändern (z. B. SQL_Latin1_General_CP1_CI_AS kann ebenfalls verwendet werden).

Ich habe meine vorherige Antwort als unnötig entfernt