Perché non esplicita COLLATE banca dati di override di regole di confronto?
-
25-09-2019 - |
Domanda
Sono in SQL Server 2008 R2 dev, regole di confronto predefinite server è Cyrillic_General_CI_AS
L'esecuzione in SSMS
SELEZIONE 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS
o
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI
uscite
- eEaAaAeEc? Una su (in ocntext di utilizzo dbName /) della base di dati con confronto predefinito Cyrillic_General_CI_AS
- éÉâÂàÀëËçæà sulla base di dati con confronto predefinito Latin1_General_CI_AS
Perché?
Soluzione
Quei letterali carattere nelle query vengono prima convertiti in stringhe VARCHAR sotto qualunque delle regole di confronto del database è impostato per, e poi il tuo Cast collazione ha effetto.
Se si desidera passare tali letterali carattere e garantire tutti i personaggi sono fedelmente rappresentati, è meglio passare loro come letterali nvarchar:
create database CollTest collate Cyrillic_General_CI_AS
go
use CollTest
go
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS
SELECT 'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI
go
SELECT N'éÉâÂàÀëËçæà' COLLATE Latin1_General_CS_AS
SELECT N'éÉâÂàÀëËçæà' COLLATE Latin1_General_CI_AI
go
Output:
-----------
eEaAaAeEc?a
(1 row(s) affected)
-----------
eEaAaAeEc?a
(1 row(s) affected)
-----------
éÉâÂàÀëËçæà
(1 row(s) affected)
-----------
éÉâÂàÀëËçæà
(1 row(s) affected)
Altri suggerimenti
Cyrillic_General_CI_AS questa tabella personaggio non contiene il chacter æ
. Questo spiegherebbe il motivo per cui si vede un ?
al suo posto se siete veramente utilizzando le impostazioni predefinite invece di quello che avete tra le istruzioni SELECT.