Ad ampliare @ risposta di Martin:
Come si imposta un "set di caratteri" in SQL Server dipende dal tipo di dati che si sta utilizzando. Se si sta utilizzando:
NVARCHAR
, NCHAR
, e NTEXT
(NTEXT
è deprecata e non dovrebbe essere usato come di SQL Server 2005) utilizzano tutti il set di caratteri Unicode e questo non può essere modificato. Questi tipi di dati sono tutti codificati come UTF-16 LE (Little Endian) – una codifica a 16 bit con ciascun "carattere" di 2 o 4 byte – e anche questo non può essere modificato. Per questi tipi di dati, le regole di confronto utilizzate riguardano solo le impostazioni locali (come determinato dal LCID del confronto) che determina l'insieme di regole utilizzate per l'ordinamento e il confronto.
XML
, come i tipi N
-prefixed, utilizza il set di caratteri Unicode ed è codificato come UTF-16 LE (Little Endian), e nessuno di questi possono essere cambiati. Ma a differenza degli altri tipi di dati stringa, non vi è alcuna Fascicolazione associata ai dati XML
in quanto non può essere ordinata o confrontata (almeno non senza prima convertirla in NVARCHAR(MAX)
[preferito] o VARCHAR(MAX)
).
VARCHAR
, CHAR
e TEXT
(TEXT
è obsoleto e non deve essere utilizzato come di SQL Server 2005) sono tutte le codifiche a 8 bit con ogni "carattere" essere 1 o 2 byte. Il set di caratteri è determinato dalla Pagina codice associata a ogni fascicolazione. Le regole di ordinamento e confronto dipendono dal tipo di regole di confronto utilizzato:
- SQL regole di confronto del server: Questi tutti hanno nomi che iniziano con
SQL_
e sono stati deprecati dalla SQL Server 2000, anche se sono (purtroppo) ancora in largo uso oggi . Questi utilizzano semplici regole indicate come il numero "Ordine ordinamento SQL Server" come trovato nel campo description
restituito da sys.fn_helpcollations()
.
- Windows Collations: tutti hanno nomi che fanno non iniziano con
SQL_
. Queste regole di confronto consentono ai dati di stringa non Unicode di utilizzare le regole di ordinamento e confronto Unicode indicate dal LCID del confronto.
Detto questo, per scoprire quale set di caratteri (per CHAR
, VARCHAR
, e TEXT
– cioè non Unicode – dati) è in uso, eseguire la seguente query e prestare la massima attenzione al CodePage
campo. Il campo LCID
indica il locale utilizzato per l'ordinamento e le regole di confronto per i N
-prefixed – cioè Unicode – tipi così come i tipi non Unicode se utilizzando un Windows regole di confronto:
SELECT *,
COLLATIONPROPERTY(col.[name], 'CodePage') AS [CodePage],
COLLATIONPROPERTY(col.[name], 'LCID') AS [LCID]
FROM sys.fn_helpcollations() col
ORDER BY col.[name];
Gli ID codice pagina essere tradotto in qualcosa di più significativo tramite la pagina MSDN per Code Page Identifiers.
Per quanto riguarda la risposta di Martin del comment su @ O.P.:
E 'un peccato che hanno scelto il fuorviante/incompleta termine "collazione" che si riferisce chiaramente alla Ordinamento: raccogliere definizione.
Se è vero che Microsoft avrebbe potuto fare meglio quando si sceglie un nome, c'è purtroppo un generale, la confusione a livello di settore su termini come "codifica", "set di caratteri", "raccolta", etc. L'uso (o l'uso improprio) di Microsoft di "Collation" ha semplicemente contribuito alla confusione di massa. Ma questa confusione è evidente anche in MySQL come mostrato in questa domanda, dato che "utf8" è specificatamente non un set di caratteri ;-).
UTF-8 è una delle numerose codifiche per il set di caratteri Unicode. UTF-16 e UTF-32 sono le altre due codifiche. Tutte e tre queste codifiche rappresentano esattamente lo stesso set di caratteri Unicode, solo in modi diversi. Guardando l'elenco dei set di caratteri MySQL – 11.1.10 Supported Character Sets and Collations – i set di caratteri "ucs2", "utf8", "utf8mb4", "utf16", "utf16le", "utf32" non sono in realtà set di caratteri, di per sé, ma varie rappresentazioni del Set di caratteri Unicode. Ma, data la sovrapposizione tra i concetti di "set di caratteri" e "codifica", sarebbe difficile non avere questa confusione.La pagina 11.1.10.1 Unicode Character Sets indica che i set di caratteri "utf8mb4", "utf16", "utf16le" e "utf32" sono i set di caratteri Unicode completi mentre "ucs2" e "utf8" sono sottoinsiemi del set di caratteri Unicode, in particolare il primo codice 65.536 punti (aka Basic Plilingual Plane (BMP)).
Per maggiori informazioni riguardo delle regole di confronto tra i vari RDBMS di, si prega di vedere la mia risposta alla seguente domanda sulla DBA.StackExchange:
Does any DBMS have a collation that is both case-sensitive and accent-insensitive?
sono la stessa cosa in SQL Server. Impostando le regole di confronto su una colonna 'varchar' si imposta anche la tabella codici. –
Grazie, Martin. Dove è documentato? Ovviamente ho seguito il manuale di precisione (MSDN online) ma non ne vedo alcuna menzione. – dotancohen
Le regole di confronto controllano la memoria fisica delle stringhe di caratteri in SQL Server. Un confronto specifica [** entrambi **] i pattern di bit che rappresentano ciascun carattere ** e ** le regole in base alle quali i caratteri vengono ordinati e confrontati. [Link] (http://msdn.microsoft.com/en-us/library/ms186356.aspx) –