Сравнение типов SQL Server и MariaDB
Эта страница помогает сопоставить каждый тип SQL Server с соответствующим типом MariaDB.
Числа
В MariaDB числовые типы могут быть объявлены как SIGNED или UNSIGNED. По умолчанию числовые столбцы являются SIGNED, поэтому отсутствие указания ни того, ни другого не нарушит совместимость с SQL Server.
При использовании UNSIGNED значений существует потенциальная проблема с вычитанием. При вычитании UNSIGNED значения из другого, результат обычно является UNSIGNED типом. Но если результат отрицательный, это вызовет ошибку. Для решения этой проблемы можно включить флаг NO_UNSIGNED_SUBTRACTION в sql_mode.
Для получения дополнительной информации см. Обзор числовых типов данных.
Целые числа
| Типы SQL Server | Размер (байты) | Типы MariaDB | Размер (байты) | Примечания |
|---|---|---|---|---|
tinyint |
1 | TINYINT | 1 | |
smallint |
2 | SMALLINT | 2 | |
| MEDIUMINT | 3 | Занимает 3 байта на диске, но 4 байта в памяти | ||
int |
1 | INT / INTEGER | 4 | |
bigint |
8 | BIGINT | 8 |
Вещественные числа (приближенные)
| Типы SQL Server | Точность | Размер | Типы MariaDB | Размер |
|---|---|---|---|---|
float(1-24) |
7 цифр | 4 | FLOAT(0-23) | 4 |
float(25-53) |
15 цифр | 8 | FLOAT(24-53) | 8 |
MariaDB поддерживает альтернативную синтаксическую конструкцию: FLOAT(M, D). M — общее количество цифр, D — количество цифр после десятичной точки.
См. также: Точность чисел с плавающей точкой.
Псевдонимы
В SQL Server real является псевдонимом для float(24).
В MariaDB DOUBLE и DOUBLE PRECISION являются псевдонимами для FLOAT(24-53).
Обычно REAL также является синонимом для FLOAT(24-53). Однако переменная sql_mode может быть установлена со флагом REAL_AS_FLOAT для того, чтобы REAL был синонимом для FLOAT(0-23).
Вещественные числа (точные)
| Типы SQL Server | Точность | Размер (байты) | Типы MariaDB | Точность | Размер (байты) |
|---|---|---|---|---|---|
decimal |
0 - 38 | До 17 | DECIMAL | 0 - 38 | См. таблицу |
MariaDB поддерживает такой синтаксис: DECIMAL(M, D). M и D необязательны. M — общее количество цифр (по умолчанию 10), D — количество цифр после десятичной точки (по умолчанию 0). В SQL Server значения по умолчанию составляют соответственно 18 и 0. Причина этого различия в том, что стандарт SQL предписывает значение по умолчанию 0 для D, но оставляет реализацию свободной в выборе значения по умолчанию для M.
SQL Server DECIMAL эквивалентен MariaDB DECIMAL(18).
Псевдонимы
В обоих SQL Server и MariaDB распознаются следующие псевдонимы для DECIMAL: DEC, NUMERIC. MariaDB также позволяет использовать FIXED.
Денежные значения
Типы SQL Server money и smallmoney представляют вещественные числа, гарантируя очень низкий уровень приближения (точность до пяти десятичных знаков), необязательно связанные с одной из поддерживаемых валют.
В MariaDB нет типов для денежных значений. Для представления денежных сумм:
- Храните валюту в отдельном столбце, если необходимо. Можно использовать внешний ключ к таблице валют или тип ENUM.
- Используйте не приближенный тип:
- DECIMAL очень удобен, так как позволяет сохранить число в неизменном виде. Но вычисления потенциально медленнее.
- Тип целого числа быстрее для вычислений. Можно, например, хранить сумму денег, умноженную на 100.
Существует небольшая несовместимость, о которой пользователи должны знать. money и smallmoney точны примерно до 4 десятичных знаков. Это означает, что если вы используете достаточное количество десятичных знаков, операции с этими типами могут давать результаты, отличные от результатов, которые они бы дали в MariaDB.
Биты
Тип BIT поддерживается в MariaDB. Его максимальный размер составляет BIT(64). Тип BIT имеет фиксированную длину. Если мы вставляем значение, требующее меньше битов, чем выделено, слева добавляются нулевые биты.
В MariaDB двоичные значения можно записать одним из следующих способов:
-
b'value' -
0value, гдеvalue— последовательность цифр 0 и 1. Также можно использовать шестнадцатеричный синтаксис. Подробности см. в Двоичные литералы и Шестнадцатеричные литералы.
MariaDB и SQL Server имеют разные наборы побитовых операторов. См. Битовые функции и операторы.
Логический псевдотип
В SQL Server обычно используется bit для представления логических значений. В MariaDB это тоже возможно, но не является распространённой практикой.
Столбец также можно определить как BOOLEAN или BOOL, что является всего лишь синонимом для TINYINT. Ключевые слова TRUE и FALSE также существуют, но являются синонимами для 1 и 0. Чтобы понять, что это подразумевает, см. Логические литералы.
В MariaDB 'True' и 'False' всегда являются строками.
Дата и время
| Типы SQL Server | Диапазон | Точность | Размер (байты) | Типы MariaDB | Диапазон | Размер (байты) | Точность | Примечания |
|---|---|---|---|---|---|---|---|---|
date |
0001-01-01 - 9999-12-31 | 3 | / | DATE | 0001-01-01 - 9999-12-31 | 3 | / | Они охватывают тот же диапазон |
datetime |
1753-01-01 - 9999-12-31 | 8 | 0 до 3, округленные | DATETIME | 001-01-01 - 9999-12-31 | 8 | 0 до 6 | Значения MariaDB не приближены, см. ниже. |
datetime2 |
001-01-01 - 9999-12-31 | 8 | 6 до 8 | DATETIME | 001-01-01 - 9999-12-31 | 8 | 0 до 6 | Значения MariaDB не приближены, см. ниже. |
smalldatetime |
DATETIME | |||||||
datetimeoffset |
DATETIME | |||||||
time |
TIME |
Также можно рассмотреть следующие типы MariaDB:
-
TIMESTAMP имеет мало общего с
timestampв SQL Server. В MariaDB это количество секунд, прошедших с начала 1970-01-01, с десятичной точностью до 6 знаков (по умолчанию 0). Значение можно необязательно автоматически установить до текущего временного отметки при вставке, при обновлении или обоих. Не предназначен для уникальной идентификации строк. - YEAR — это 1-байтовый тип, представляющий годы от 1901 до 2155, а также 0000.
Значения нулей
MariaDB допускает специальное значение, где все части даты равны нулю: '0000-00-00'. Это можно запретить, установив sql_mode=NO_ZERO_DATE.
Также можно использовать значения, где только некоторые части даты равны нулю, например, '1994-01-00' или '1994-00-00' . Эти значения можно запретить, установив sql_mode=NO_ZERO_IN_DATE. Они не зависят от NO_ZERO_DATE.
Синтаксис
Понимаются несколько различных форматов дат. Обычно используются форматы 'YYYY-MM-DD' и YYYYMMDD . Принимаются несколько разделителей.
Понимаются синтаксис, определенный в стандарте SQL и ODBC — например, DATE '1994-01-01' и {d '1994-01-01'} . Использование этих форматов устраняет возможные неоднозначности в контекстах, где временное значение может интерпретироваться как строка или как целое число.
Подробности см. в Литералы дат и времени.
Точность
Для временных типов, включающих время суток, MariaDB позволяет задавать точность от 0 до 6 (микросекунды), по умолчанию 0. Подсекундная часть никогда не приближается. Добавляет до 3 байтов. Подробности см. в Требования к хранению типов данных.
Строки и двоичные данные
Двоичные строки
| Типы SQL Server | Размер (байты) | Типы MariaDB | Примечания |
|---|---|---|---|
binary |
1 до 8000 | VARBINARY или BLOB | См. ниже для типов BLOB |
varbinary |
1 до 8000 | VARBINARY или BLOB | См. ниже для типов BLOB |
image |
2^31-1 | VARBINARY или BLOB | См. ниже для типов BLOB |
Тип VARBINARY похож на VARCHAR, но хранит двоичные байтовые строки, так же как и binary в SQL Server.
Для больших двоичных строк MariaDB имеет четыре типа BLOB, с различными размерами. Подробнее см. Типы данных BLOB и TEXT.
Строки символов
Важное отличие между SQL Server и MariaDB заключается в том, что в MariaDB наборы символов не зависят от типов и кодировок. Наборы символов могут быть установлены на уровне базы данных, таблицы или столбца. Если этого не сделать, применяются значения по умолчанию, указанные в системной переменной character_set_server.
Для создания таблицы MariaDB, идентичной таблице SQL Server, возможно, потребуется указать набор символов для каждого столбца строк. Однако во многих случаях использование UTF-8 будет работать.
| Типы SQL Server | Размер (байты) | Типы MariaDB | Размер (байты) | Набор символов |
|---|---|---|---|---|
char |
1 до 8000 | CHAR | 0 до 255 |
utf8mb4 (1, 4) |
varchar |
1 до 8000 | VARCHAR | 0 до 65 532 (2) |
utf8mb4 (1) |
text |
2^31-1 | TEXT | 2^31-1 | ucs2 |
nchar |
2 до 8000 | CHAR | 0 до 255 |
utf16 или ucs2 (3, 4) |
nvarchar |
2 до 8000 | VARCHAR | 0 до 65 532 (2) (5) |
utf16 или ucs2 (1) (3) |
ntext |
2^30 - 1 | TEXT | 2^31-1 | ucs2 |
Примечания:
1) Если SQL Server использует кодировку без поддержки Unicode, используется подмножество UTF-8. Поэтому можно использовать и меньший набор символов в MariaDB.
2) InnoDB имеет максимальную длину строки 65 535 байт. Столбцы типа TEXT не влияют на размер строки, так как они хранятся отдельно (кроме первых 12 байт).
3) В SQL Server используется UTF-16, если данные содержат дополнительные символы, в противном случае используется UCS-2. Если не уверены, используйте utf16 в MariaDB.
4) В SQL Server значение ANSI_PADDING определяет, должны ли значения char быть дополнены пробелами до их максимальной длины. В MariaDB это зависит от флага sql_mode PAD_CHAR_TO_FULL_LENGTH.
5) См. JSON ниже.
Специальные типы SQL Server
rowversion
В MariaDB нет типа rowversion.
Если единственная цель — проверить, была ли строка изменена с момента последнего чтения, можно использовать столбец TIMESTAMP. Его значение по умолчанию должно быть ON UPDATE CURRENT_TIMESTAMP. Таким образом, метка времени будет обновляться каждый раз при изменении столбца.
Способом сохранения гораздо больше информации является использование временной таблицы. Предыдущие версии строки будут сохранены.
sql_variant
MariaDB не поддерживает тип sql_variant.
MariaDB достаточно гибкий в отношении неявных и явных преобразований типов. Поэтому в большинстве случаев хранение значений в виде строки должно быть эквивалентно использованию sql_variant.
Учитывайте, что максимальная длина значения sql_variant составляет 8000 байт. В MariaDB вам может потребоваться использовать TINYBLOB.
uniqueidentifier
Хотя MariaDB не поддерживает тип uniqueidentifier, тип UUID обычно можно использовать для той же цели.
Столбцы uniqueidentifier содержат 16-разрядные GUID. Столбцы UUID в MariaDB хранят значения UUIDv1 (128 бит).
Тип UUID был реализован в MariaDB 10.7. В более старых версиях вы можете генерировать уникальные значения с помощью функций UUID() или UUID_SHORT() и хранить их в столбцах BIT(128) или BIT(64) соответственно.
xml
MariaDB не поддерживает тип xml.
Данные XML могут храниться в строковых столбцах. MariaDB поддерживает несколько функций XML.
JSON
В SQL Server JSON-документы обычно хранятся в столбцах nvarchar в текстовой форме.
MariaDB имеет псевдотип JSON, который сопоставляется с LONGTEXT. Однако, начиная с MariaDB 10.5, псевдотип JSON также проверяет, является ли значение допустимым JSON-документом.
MariaDB поддерживает другие функции JSON, чем SQL Server. В MariaDB функций сейчас больше, и синтаксис SQL Server не будет работать. Подробнее см. Функции JSON.
Уникальные типы MariaDB
Следующие типы поддерживаются в MariaDB и не имеют прямого эквивалента в SQL Server. Если вы мигрируете свою базу данных в MariaDB, вы можете рассмотреть возможность использования этих типов.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/sql-server-and-mariadb-types-comparison/