Кодировка символов SQL Server по умолчанию
По умолчанию - какая кодировка символов установлена для базы данных в Microsoft SQL Server?
Как я могу увидеть текущую кодировку символов в SQL Server?
5 ответов
Если вам нужно знать параметры сортировки по умолчанию для вновь созданной базы данных, используйте:
SELECT SERVERPROPERTY('Collation')
Это сопоставление сервера для экземпляра SQL Server, который вы используете.
Кодировки
SQL Server хранит данные Unicode (то есть те, которые находятся в XML
а также N
с префиксом типов) в UCS-2 / UTF-16 (хранилище одинаковое, UTF-16 просто корректно обрабатывает дополнительные символы). Это не настраивается: нет возможности использовать UTF-8 или UTF-32. То, могут ли встроенные функции правильно обрабатывать дополнительные символы, и правильно ли они отсортированы и сопоставлены, зависит от используемого сопоставления. Старые сопоставления приравнивают все дополнительные символы друг к другу. Начиная с SQL Server 2005, они представили 90
Сериалы серии (те, с _90_
в названии), который мог бы по крайней мере выполнить двоичное сравнение с дополнительными символами, чтобы вы могли различать их, даже если они не отсортированы в нужном порядке. Это также верно для 100
Серия сортировок представлена в SQL Server 2008. В SQL Server 2012 представлена сортировка с именами, заканчивающимися на _SC
это не только правильно сортирует дополнительные символы, но и позволяет встроенным функциям интерпретировать их должным образом (т. е. обрабатывать суррогатную пару как один объект). Начиная с SQL Server 2017, все новые параметры сортировки (140
series) неявно поддерживают дополнительные символы, следовательно, нет новых сопоставлений с именами, заканчивающимися на _SC
,
Данные не в Юникоде (то есть те, которые находятся в CHAR
, VARCHAR
, а также TEXT
типы - но не использовать TEXT
использовать VARCHAR(MAX)
вместо этого) используется 8-битное кодирование (Extended ASCII, DBCS или EBCDIC). Конкретный набор символов / кодировка основывается на кодовой странице, которая, в свою очередь, основана на сопоставлении столбца, или сопоставлении текущей базы данных для литералов и переменных, или сопоставлении экземпляра для имен переменных / курсоров и GOTO
ярлыки, или что указано в COLLATE
пункт, если один используется.
Чтобы увидеть, как локали соответствуют параметрам сортировки, проверьте:
Чтобы увидеть кодовую страницу, связанную с определенным сопоставлением (это набор символов и влияет только CHAR
/ VARCHAR
/ TEXT
данные), запустите следующее:
SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'CodePage' ) AS [CodePage];
Чтобы увидеть LCID (т. Е. Языковой стандарт), связанный с определенным сопоставлением (это влияет на правила сортировки и сравнения), выполните следующее:
SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'LCID' ) AS [LCID];
Чтобы просмотреть список доступных параметров сортировки, а также связанные с ними LCID и кодовые страницы, выполните:
SELECT [name],
COLLATIONPROPERTY( [name], 'LCID' ) AS [LCID],
COLLATIONPROPERTY( [name], 'CodePage' ) AS [CodePage]
FROM sys.fn_helpcollations()
ORDER BY [name];
Значения по умолчанию
Прежде чем рассматривать параметры сортировки сервера и базы данных по умолчанию, необходимо понять относительную важность этих значений по умолчанию.
Сортировка по умолчанию для сервера (Экземпляр, действительно) используется по умолчанию для вновь создаваемых баз данных (включая системные базы данных: master
, model
, msdb
, а также tempdb
). Но это не означает, что любая база данных (кроме 4-х системных БД) использует это сопоставление. Сортировка базы данных по умолчанию может быть изменена в любое время. Однако параметры сортировки по умолчанию на сервере изменить не так просто. Сервер /Instance Collation контролирует:
- имена локальных переменных
- Имена курсоров
- GOTO этикетки
Сортировка базы данных по умолчанию используется двумя способами:
- по умолчанию для вновь создаваемых строковых столбцов. Но это не означает, что любой строковый столбец использует это сопоставление. Сортировка столбца может быть изменена в любое время. Здесь знание базы данных по умолчанию является важным показателем того, на что наиболее вероятно установлены строковые столбцы.
- как сортировка для операций, включающих строковые литералы, переменные и встроенные функции, которые не принимают строковые входные данные, но производят строковый вывод (т.е.
IF (@InputParam = 'something')
). В данном случае знание базы данных по умолчанию определенно важно, так как она определяет поведение этих операций.
Столбец Collation либо указан в COLLATE
пункт во время CREATE TABLE
или ALTER TABLE {table_name} ALTER COLUMN
или, если не указан, берется из базы данных по умолчанию.
Поскольку здесь есть несколько слоев, в которых можно указать параметры сортировки (база данных по умолчанию / столбцы / литералы и переменные), результирующая сортировка определяется приоритетом сортировки.
Все это говорит о том, что в следующем запросе показаны текущие настройки по умолчанию для ОС, экземпляра SQL Server и указанной базы данных:
SELECT os_language_version,
---
SERVERPROPERTY('LCID') AS 'Instance-LCID',
SERVERPROPERTY('Collation') AS 'Instance-Collation',
SERVERPROPERTY('ComparisonStyle') AS 'Instance-ComparisonStyle',
SERVERPROPERTY('SqlSortOrder') AS 'Instance-SqlSortOrder',
SERVERPROPERTY('SqlSortOrderName') AS 'Instance-SqlSortOrderName',
SERVERPROPERTY('SqlCharSet') AS 'Instance-SqlCharSet',
SERVERPROPERTY('SqlCharSetName') AS 'Instance-SqlCharSetName',
---
DATABASEPROPERTYEX(N'{database_name}', 'LCID') AS 'Database-LCID',
DATABASEPROPERTYEX(N'{database_name}', 'Collation') AS 'Database-Collation',
DATABASEPROPERTYEX(N'{database_name}', 'ComparisonStyle') AS 'Database-ComparisonStyle',
DATABASEPROPERTYEX(N'{database_name}', 'SQLSortOrder') AS 'Database-SQLSortOrder'
FROM sys.dm_os_windows_info;
ОБНОВЛЕНИЕ 2018-10-02
Хотя этот вариант пока не подходит, в SQL Server 2019 появилась встроенная поддержка UTF-8 в VARCHAR
/ CHAR
типы данных. В настоящее время в нем слишком много ошибок, чтобы его можно было использовать, но если они исправлены, то это вариант для некоторых сценариев. Пожалуйста, ознакомьтесь с моим постом " Поддержка UTF-8 в SQL Server 2019: Спаситель или Лжепророк?" Для подробного анализа этой новой функции.
Кодировка символов по умолчанию для базы данных SQL Server iso_1, то есть ISO 8859-1. Обратите внимание, что кодировка символов зависит от типа данных столбца. Вы можете получить представление о том, какие кодировки символов используются для столбцов в базе данных, а также параметров сортировки, используя этот SQL:
select data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, count(*) count
from information_schema.columns
group by data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name;
Если используется значение по умолчанию, имя_символа_символа должно быть iso_1 для типов данных char и varchar. Поскольку nchar и nvarchar хранят данные Unicode в формате UCS-2, имя_символа_символа для этих типов данных является UNICODE.
SELECT DATABASEPROPERTYEX('DBName', 'Collation') SQLCollation;
Где DBName - это имя вашей базы данных.
Я думаю, что это заслуживает отдельного ответа: хотя данные внутри Юникода хранятся как UTF-16 в Sql Server, это вариант Little Endian, поэтому, если вы вызываете базу данных из внешней системы, вам, вероятно, нужно указать UTF-16LE.
Вы можете увидеть настройки сопоставления для каждой таблицы, как в следующем коде:
SELECT t.name TableName, c.name ColumnName, collation_name
FROM sys.columns c
INNER JOIN sys.tables t on c.object_id = t.object_id where t.name = 'name of table';