Spec-Zone.ru › MariaDB

SQL_MODE

MariaDB поддерживает несколько различных режимов, позволяющих настроить его под ваши нужды.

Наиболее важными способами для этого являются использование SQL_MODE (управляемого системной переменной sql_mode) и OLD_MODE (системная переменная old_mode). SQL_MODE используется для того, чтобы MariaDB эмулировал поведение других SQL-серверов, в то время как OLD_MODE используется для эмуляции поведения более старых версий MariaDB или MySQL.

SQL_MODE — это строка с различными опциями, разделенными запятыми (',') без пробелов. Опции нечувствительны к регистру.

Вы можете проверить локальное и глобальное значение с помощью:

SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE;

Настройка SQL_MODE

Значения по умолчанию

Версия Значение sql_mode по умолчанию
MariaDB 10.2.4 STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO , NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
MariaDB 10.1.7 NO_ENGINE_SUBSTITUTION, NO_AUTO_CREATE_USER
<= MariaDB 10.1.6 Без значения

Вы можете установить SQL_MODE как из командной строки (командная строка) (опция --sql-mode), так и задав системную переменную sql_mode.

SET sql_mode = 'modes';
SET GLOBAL sql_mode = 'modes';

Значение сеанса влияет только на текущего клиента и может быть изменено клиентом по мере необходимости. Для установки глобального значения требуется привилегия SUPER, и изменение повлияет на всех клиентов, подключившихся с этого момента.

Значения SQL_MODE

Различные SQL_MODE значения:

ALLOW_INVALID_DATES

Разрешает любой день от 1 до 31 в части дня. Это удобно, когда вы хотите считать все (включая неправильные данные) в базу данных и затем обработать их там.

ANSI

Изменяет синтаксис SQL, приближая его к ANSI SQL.

Устанавливает: REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE.

Также добавляет ограничение: будет возвращена ошибка, если подзапрос использует агрегирующую функцию с ссылкой на столбец из внешнего запроса таким образом, что это невозможно разрешить.

Если задано, в выводе SHOW CREATE TABLE не будут отображаться специфичные для MariaDB атрибуты таблицы.

ANSI_QUOTES

Изменяет " на то, чтобы он обрабатывался как `, символ кавычек для идентификаторов. Это может сломать старые приложения MariaDB, которые предполагают, что " используется как символ кавычек для строк.

DB2

То же, что: PIPES_AS_CONCAT, ANSI_QUOTES , IGNORE_SPACE, DB2, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS

Если задано, в выводе SHOW CREATE TABLE не будут отображаться специфичные для MariaDB атрибуты таблицы.

EMPTY_STRING_IS_NULL

Опция совместимости Oracle, которая преобразует Item_string, созданный в анализаторе, в Item_null и преобразует привязку пустой строки как параметры подготовленного оператора в привязку NULL. Например, SELECT '' IS NULL возвращает TRUE, INSERT INTO t1 VALUES ('') вставляет NULL. С версии MariaDB 10.3.3

ERROR_FOR_DIVISION_BY_ZERO

Если не задано, деление на ноль возвращает NULL. Если задано, возвращает ошибку, если кто-то пытается обновить столбец с 1/0, и также возвращает предупреждение. Также см. MDEV-8319. По умолчанию с версии MariaDB 10.2.4.

HIGH_NOT_PRECEDENCE

Опция совместимости для MySQL 5.0.1 и ранее; Это изменяет NOT a BETWEEN b AND c на обработку как (NOT a) BETWEEN b AND c

IGNORE_BAD_TABLE_OPTIONS

Если это задано, генерируется предупреждение (а не ошибка) для неправильной опции таблицы в CREATE TABLE. Кроме того, начиная с 10.0.13, эти неправильные опции таблиц не комментируются в SHOW CREATE TABLE.

IGNORE_SPACE

Разрешает наличие пробелов (включая символы табуляции и новой строки) между именем функции и '('. Недостаток заключается в том, что это приводит к тому, что встроенные функции становятся зарезервированными словами.

MAXDB

То же, что: PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, MAXDB, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.

Также приводит к тому, что поля типа TIMESTAMP молча преобразуются в поля типа DATETIME при создании или изменении.

Если задано, в выводе SHOW CREATE TABLE не будут отображаться специфичные для MariaDB атрибуты таблицы.

MSSQL

Кроме того, подразумевает следующее: PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS.

Кроме того, начиная с MariaDB 10.4.5, реализует ограниченный подмножество языка Microsoft SQL Server. Более подробная информация см. в SQL_MODE=MSSQL.

Если задано, в выводе SHOW CREATE TABLE не будут отображаться специфичные для MariaDB атрибуты таблицы.

MYSQL323

То же, что: NO_FIELD_OPTIONS, HIGH_NOT_PRECEDENCE.

MYSQL40

То же, что: NO_FIELD_OPTIONS, HIGH_NOT_PRECEDENCE.

NO_AUTO_CREATE_USER

Не создавайте автоматически пользователей с GRANT , если не указана информация об аутентификации. Если она не указана, появится ошибка 1133: «Не найдено соответствующей строки в таблице пользователей». По умолчанию с версии MariaDB 10.1.7.

NO_AUTO_VALUE_ON_ZERO

Если задано, не генерировать AUTO_INCREMENT при INSERT нуля в столбец типа AUTO_INCREMENT, или при добавлении атрибута AUTO_INCREMENT с помощью инструкции ALTER TABLE. Обычно и zero и NULL генерируют новые значения AUTO_INCREMENT.

NO_BACKSLASH_ESCAPES

Отключает использование обратного слэша \ в качестве символа экранирования внутри строк, делая его обычным символом.

NO_DIR_IN_CREATE

Игнорирует все директивы INDEX DIRECTORY и DATA DIRECTORY при создании таблицы. Может быть полезно на серверах репликации slave replication.

NO_ENGINE_SUBSTITUTION

Если не установлено, если доступный движок хранения, указанный в CREATE TABLE, недоступен, выдается предупреждение, и вместо него используется движок хранения по умолчанию. Если установлено, генерируется ошибка 1286 при создании таблицы, если указанный движок хранения недоступен. См. также enforce_storage_engine. По умолчанию с версии MariaDB 10.1.7.

NO_FIELD_OPTIONS

Удаляет специфичные для MariaDB опции столбцов из вывода SHOW CREATE TABLE. Также используется режимом переноса mariadb-dump.

NO_KEY_OPTIONS

Удаляет специфичные для MariaDB опции индексов из вывода SHOW CREATE TABLE. Также используется режимом переноса mariadb-dump.

NO_TABLE_OPTIONS

Удаляет специфичные для MariaDB опции таблиц из вывода SHOW CREATE TABLE. Также используется режимом переноса mariadb-dump.

NO_UNSIGNED_SUBTRACTION

При включении результаты вычитания являются знаковыми, даже если операнды беззнаковые.

NO_ZERO_DATE

Не разрешает '0000-00-00' как допустимую дату в строгом режиме (возвращает ошибку 1525). Нулевые даты можно вставлять с IGNORE. Если режим не строгий, генерируется предупреждение.

NO_ZERO_IN_DATE

Не разрешает даты, где год не равен нулю, но месяц или день даты равны нулю (возвращает ошибку 1525). Например, при заданном значении '0000-00-00' разрешается, но '1970-00-10' или '1929-01-00' — нет. Если используется опция ignore, MariaDB вставит '0000-00-00' для таких дат. Если режим не строгий, генерируется предупреждение вместо ошибки.

ONLY_FULL_GROUP_BY

Для запросов SELECT ... GROUP BY, запрещает SELECT столбцов, которые не указаны в условии GROUP BY, за исключением случаев, когда они передаются в агрегатную функцию, такую как COUNT() или MAX(). Возвращает ошибку 1055.

ORACLE

Во всех версиях MariaDB до MariaDB 10.2 это устанавливает sql_mode, что эквивалентно: PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER

С MariaDB 10.3 этот режим также устанавливает SIMULTANEOUS_ASSIGNMENT и настраивает сервер на понимание большого подмножества языка Oracle PL/SQL вместо традиционной синтаксической конструкции MariaDB для хранимых процедур. См. SQL_MODE=ORACLE From MariaDB 10.3.

Если установлено, вывод SHOW CREATE TABLE не будет отображать атрибуты таблицы, специфичные для MariaDB.

PAD_CHAR_TO_FULL_LENGTH

Пробелы в конце CHAR-колонок по умолчанию обрезаются при извлечении. При включенном PAD_CHAR_TO_FULL_LENGTH обрезка не происходит. Не относится к VARCHAR.

PIPES_AS_CONCAT

Разрешает использовать символ «|» (ASCII 124) как оператор конкатенации строк. Это означает, что "A" || "B" может быть использован вместо CONCAT("A", "B").

POSTGRESQL

То же самое, что: PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, POSTGRESQL, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS.

Если установлено, вывод SHOW CREATE TABLE не будет отображать атрибуты таблицы, специфичные для MariaDB.

REAL_AS_FLOAT

REAL является синонимом для FLOAT, а не DOUBLE.

SIMULTANEOUS_ASSIGNMENT

Установление этого значения заставляет часть SET оператора UPDATE оценивать все присваивания одновременно, а не слева направо. С версии MariaDB 10.3.5.

STRICT_ALL_TABLES

Режим строгости. Операторы с некорректными или отсутствующими данными прерываются и отменяются. Для нетранзакционного хранилища с оператором, затрагивающим несколько строк, это может означать частичный ввод или обновление, если ошибка найдена в строке, которая следует за первой.

STRICT_TRANS_TABLES

Режим строгости. Операторы с некорректными или отсутствующими данными прерываются и отменяются, за исключением случаев, когда для нетранзакционных хранилищ и операторов, влияющих на несколько строк, где некорректные или отсутствующие данные не находятся в первой строке, MariaDB преобразует некорректное значение в ближайшее допустимое значение или, если значение отсутствует, вставит значение по умолчанию столбца. По умолчанию с MariaDB 10.2.4.

TIME_ROUND_FRACTIONAL

При выключенном режиме MariaDB обрезает дробные секунды при изменении точности на меньшую. При включенном режиме MariaDB будет округлять при преобразовании в TIME, DATETIME и TIMESTAMP и обрезать при преобразовании в DATE. С MariaDB 10.4.1

TRADITIONAL

Заставляет MariaDB работать как традиционный SQL-сервер. То же самое, что: STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, TRADITIONAL, NO_AUTO_CREATE_USER.

Режим строгости

Режим, в котором хотя бы один из STRICT_TRANS_TABLES или STRICT_ALL_TABLES включен, называется режимом строгости.

При установленном режиме строгости (по умолчанию с MariaDB 10.2.4), операторы, изменяющие таблицы (либо транзакционные для STRICT_TRANS_TABLES или все для STRICT_ALL_TABLES ), будут отклоняться, и вместо этого будет возвращено сообщение об ошибке. Ключевое слово IGNORE можно использовать при установленном режиме строгости для преобразования ошибки в предупреждение.

При не установленном режиме строгости (по умолчанию в версиях <= MariaDB 10.2.3), MariaDB автоматически корректирует недопустимые значения, например, обрезает слишком длинные строки или корректирует числовые значения, выходящие за пределы диапазона, и выводит предупреждение.

Операторы, не изменяющие данные, будут возвращать предупреждение при корректировке независимо от режима.

SQL_MODE и хранимые программы

Хранимые программы и представления всегда используют SQL_MODE, активный при их создании. Это означает, что пользователи могут безопасно изменять сеансовый или глобальный SQL_MODE; хранимые программы, которые они используют, по-прежнему будут работать как обычно.

Возможна смена сеансового SQL_MODE внутри хранимой программы. В этом случае новый SQL_MODE будет действовать только в теле текущей хранимой программы. Если она вызывает некоторые хранимые процедуры, они не будут затронуты этим изменением.

Некоторые таблицы Information Schema (например, ROUTINES) и операторы SHOW CREATE, такие как SHOW CREATE PROCEDURE, отображают SQL_MODE, используемый хранимыми программами.

Примеры

В этом примере показано, как получить читаемый список включенных флагов SQL_MODE:

SELECT REPLACE(@@SQL_MODE, ',', '\n');
+-------------------------------------------------------------------------+
| REPLACE(@@SQL_MODE, ',', '\n')                                          |
+-------------------------------------------------------------------------+
| STRICT_TRANS_TABLES
NO_ZERO_IN_DATE
NO_ZERO_DATE
NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------+

Добавление нового флага:

SET @@SQL_MODE = CONCAT(@@SQL_MODE, ',NO_ENGINE_SUBSTITUTION');

Если указанный флаг уже включен, приведенный выше пример не повлияет, но не вызовет ошибки.

Как отключить флаг:

SET @@SQL_MODE = REPLACE(@@SQL_MODE, 'NO_ENGINE_SUBSTITUTION', '');

Как проверить, установлен ли флаг:

SELECT @@SQL_MODE LIKE '%NO_ZERO_DATE%';
+----------------------------------+
| @@SQL_MODE LIKE '%NO_ZERO_DATE%' |
+----------------------------------+
|                                1 |
+----------------------------------+

Без режима строгости и с ним:

CREATE TABLE strict (s CHAR(5), n TINYINT);

INSERT INTO strict VALUES ('MariaDB', '128');
Query OK, 1 row affected, 2 warnings (0.14 sec)

SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1265 | Data truncated for column 's' at row 1     |
| Warning | 1264 | Out of range value for column 'n' at row 1 |
+---------+------+--------------------------------------------+
2 rows in set (0.00 sec)

SELECT * FROM strict;
+-------+------+
| s     | n    |
+-------+------+
| Maria |  127 |
+-------+------+

SET sql_mode='STRICT_TRANS_TABLES';

INSERT INTO strict VALUES ('MariaDB', '128');
ERROR 1406 (22001): Data too long for column 's' at row 1

Переопределение режима строгости с помощью ключевого слова IGNORE:

INSERT IGNORE INTO strict VALUES ('MariaDB', '128');
Query OK, 1 row affected, 2 warnings (0.15 sec)

См. также

  • SQL_MODE=MSSQL
  • SQL_MODE=ORACLE
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не предварительно проверяется MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают позиции 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-mode/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API