Почему MSSQL не поддерживает «НАБОР СИМВОЛОВ», указанный как часть инструкции «СОЗДАТЬ БАЗУ ДАННЫХ»?

#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. Просто чтобы быть точным: набор СИМВОЛОВ является кодировкой (физический уровень), в то время как сопоставление управляет поведением строк на логическом уровне.