#sql-server #database
#sql-server #База данных
Вопрос:
Я привык работать с базами данных MySQL, где CHARACTER SET
(необязательно) указывается как часть CREATE DATABASE
инструкции вместе с COLLATION
:
engine.execute(f'CREATE DATABASE IF NOT EXISTS {db} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci')
Однако для MSSQL я могу указать только COLLATION
:
engine.execute(f'CREATE DATABASE {db} COLLATE Latin1_General_100_CI_AI_SC')
Почему невозможно указать CHARACTER SET
, при создании баз данных для MSSQL?
Комментарии:
1. Потому что SQL Server работает не так, как MySQL. Сопоставление включает в себя как правила сравнения строк, так и (неявно) используемую кодировку (для
VARCHAR
;NVARCHAR
всегда использует UTF-16).2. Обратите внимание, что поддержка UTF-8 (введенная в SQL Server 2019) значительно увеличила количество сопоставлений из-за этого: у большинства теперь есть
_UTF8
вариант, который использует UTF-8, а не «родную» кодировку для этого сопоставления.3. @JeroenMostert — значит, параметры сортировки SQL Server также включают определенный набор символов? Разве это не очень негибко? Почему вы называете набор символов кодировкой ?
4. Это не особенно негибко, просто неуклюже. Правила сортировки должны применяться ко всем поддерживаемым символам; это означает, что полное разделение параметров сортировки и наборов символов в первую очередь невозможно. В SQL Server сопоставление определяет все эти вещи: правила сравнения (сопоставления), набор символов (какие символы могут быть сохранены) и кодировку (способ хранения символов в виде двоичных кодовых точек). «Набор символов» и «кодировка» связаны, но не совсем одно и то же; MySQL, возможно, неправильно использует этот термин (
utf8mb4
иutf16
допускает одни и те же символы).5. И опять же, обратите внимание, что для
NVARCHAR
, сопоставление действительно определяет только правила сопоставления, а не набор символов или кодировку («каждый символ Юникода» и «UTF-16» соответственно); только дляVARCHAR
сопоставление также диктует это.
Ответ №1:
Существует тесная и взаимная связь между сопоставлением и набором символов. Некоторая сортировка может быть предложена в некотором наборе символов, но не в каком-либо другом. Смешивание всех наборов символов и сопоставлений невозможно. Microsoft SQL Server сделал выбор в пользу простоты, предоставляя наиболее распространенные возможности путем сопоставления, которое вызывает набор символов. Именно поэтому, на самом деле, MS SQL Server имеет наиболее полный выбор символов / параметров сортировки среди всех баз данных мира…
Для этого существует 2 семейства СОПОСТАВЛЕНИЙ :
- сопоставления для семантической обработки данных, называемые «Сопоставлениями Windows» и соответствующие общему набору символов ASCII / UNICODE
- сопоставления для технической эксплуатации данных, называемые «сопоставлениями SQL» и соответствующие определенным наборам символов (эти сопоставления обозначаются префиксом «SQL_»).
Сопоставления SQL используются в основном для импорта данных без потери специальных символов, когда у вас есть файл с определенной кодировкой символов.
Таким образом, CREATE DATABASE поддерживает сопоставление только как часть инструкции, которая вызывает набор символов.
Комментарии:
1. Просто чтобы быть точным: набор СИМВОЛОВ является кодировкой (физический уровень), в то время как сопоставление управляет поведением строк на логическом уровне.