Spec-Zone .ru
спецификации, руководства, описания, API
|
Сервер MySQL может работать в различных режимах SQL, и может применить эти режимы по-другому для различных клиентов. Эта возможность позволяет каждому приложению адаптировать рабочий режим сервера в соответствии со своими собственными требованиями.
Для ответов на некоторые вопросы, которые часто спрашивают о режимах SQL сервера в MySQL, см. Раздел B.3, "FAQ MySQL 5.7: Режим SQL Сервера".
Режимы определяют то, что должен поддерживать MySQL синтаксиса SQL и какое подтверждение правильности данных проверяет, что должно выполнить. Это облегчает использовать MySQL в различных средах и использовать MySQL вместе с другими серверами баз данных.
Работая с InnoDB
таблицы, рассмотрите также innodb_strict_mode
параметр конфигурации. Это включает дополнительным проверкам
на ошибки на InnoDB
таблицы, как перечислено в Разделе
14.2.5.7,"InnoDB
Строгий Режим".
Можно установить режим SQL значения по умолчанию, запускаясь mysqld с --sql-mode="
опция, или
при использовании modes
"sql-mode="
в modes
"my.cnf
(Операционные системы Unix) или my.ini
(Windows). modes
список различных режимов, разделенных запятой (",
") символы. Режим SQL значения по умолчанию в MySQL 5.7 NO_ENGINE_SUBSTITUTION
. Чтобы очистить режим явно, установите это в пустое
строковое использование --sql-mode=""
на командной строке, или с sql-mode=""
в my.cnf
на системах Unix
или в my.ini
на Windows.
Можно изменить режим SQL во времени выполнения при использовании a SET [GLOBAL|SESSION]
sql_mode='
оператор, чтобы установить modes
'sql_mode
системное значение. Установка GLOBAL
переменная требует SUPER
полномочие и влияет на работу всех клиентов, которые соединяются с того времени на. Установка SESSION
переменная влияет только на текущий клиент. Любой клиент может изменить
его собственный сеанс sql_mode
значение в любое время.
Режим SQL и определяемое пользователем разделение. Изменение режима SQL сервера после создания и вставки данных в разделенные таблицы может вызвать существенные изменения в поведении таких таблиц, и могло привести к потере или повреждению данных. Строго рекомендуется, чтобы Вы никогда не изменили режим SQL, как только Вы составили таблицы, использующие определяемое пользователем разделение.
Тиражируя разделенные таблицы, расходясь режимы SQL в ведущем устройстве и ведомом устройстве могут также привести к проблемам. Для лучших результатов следует всегда использовать тот же самый режим SQL сервера на ведущем устройстве и на ведомом устройстве.
См. Раздел 17.6, "Ограничения и Ограничения на Разделение", для получения дополнительной информации.
Можно получить текущую глобальную переменную или сеанс sql_mode
значение со следующими операторами:
SELECT @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode;
Самое важное sql_mode
значения - вероятно, они:
Этот режим изменяет синтаксис и поведение, чтобы соответствовать более близко стандартному SQL. Это - один из специальных режимов комбинации, перечисленных в конце этого раздела.
Если значение не могло бы быть вставлено как дано в транзакционную таблицу, прервать оператор. Для нетранзакционной таблицы прервите оператор, если значение происходит в операторе единственной строки или первой строке оператора многократной строки. Больше детали дается позже в этом разделе.
Заставьте MySQL вести себя как "традиционная" система базы данных SQL. Простое описание этого режима, "дают ошибку вместо предупреждения", вставляя неправильное значение в столбец. Это - один из специальных режимов комбинации, перечисленных в конце этого раздела.
Когда это руководство относится к "строгому режиму," это означает режим где по крайней мере один из STRICT_TRANS_TABLES
или STRICT_ALL_TABLES
включается.
Следующий список описывает все поддерживаемые режимы:
Не выполняйте полную проверку дат. Проверьте только, что месяц находится в диапазоне от 1 до 12, и
день находится в диапазоне от 1 до 31. Это очень удобно для Веб-приложений, где Вы получаете год,
месяц, и день в трех различных полях, и Вы хотите сохранить точно что введенный пользователь (без
проверки допустимости даты). Этот режим применяется к DATE
и DATETIME
столбцы. Это не применяется TIMESTAMP
столбцы, которые всегда требуют допустимой даты.
Сервер требует в том месяце, и дневные значения являются законными, и не просто в диапазоне 1 - 12 и
1 к 31, соответственно. Со строгим режимом отключенные, недопустимые даты такой как '2004-04-31'
преобразовываются в '0000-00-00'
и предупреждение сгенерировано. Со строгим включенным
режимом, недопустимые даты генерируют ошибку. Чтобы разрешить такие даты, включить ALLOW_INVALID_DATES
.
Обработка""
"как
символ кавычки идентификатора (как"`
"символ кавычки) и не как строковый символ
кавычки. Можно все еще использовать"`
"чтобы заключить идентификаторы в кавычки с этим
включенным режимом. С ANSI_QUOTES
включенный, невозможно использовать двойные кавычки,
чтобы заключить литеральные строки в кавычки, потому что это интерпретируется как идентификатор.
Произведите ошибку в строгом режиме (иначе предупреждение) когда подразделение нулем (или MOD(X,0)
)
происходит во время INSERT
или UPDATE
. Если этот режим не включается, MySQL вместо этого
возвращается NULL
для подразделений нулем. Для INSERT IGNORE
или UPDATE IGNORE
,
MySQL генерирует предупреждение для подразделений нулем, но результат работы NULL
.
Приоритет NOT
оператор является так, что выражениями такой как NOT a BETWEEN b AND c
анализируются как NOT (a BETWEEN b AND c)
. В некоторых более старых
версиях MySQL выражение было проанализировано как (NOT a) BETWEEN b AND
c
. Старое поведение более высокого приоритета может быть получено, включая HIGH_NOT_PRECEDENCE
Режим SQL.
mysql>SET sql_mode = '';
mysql>SELECT NOT 1 BETWEEN -5 AND 5;
-> 0mysql>SET sql_mode = 'HIGH_NOT_PRECEDENCE';
mysql>SELECT NOT 1 BETWEEN -5 AND 5;
-> 1
Разрешение располагает с интервалами между именем функции и"(
"символ. Это заставляет
встроенные имена функций быть обработанными как зарезервированные слова. В результате
идентификаторы, которые являются тем же самым как именами функций, должны быть заключены в кавычки
как описано в Разделе 9.2, "Имена объектов Схемы".
Например, потому что есть a COUNT()
функция, использование count
поскольку имя таблицы в следующем операторе вызывает ошибку:
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
Имя таблицы должно быть заключено в кавычки:
mysql> CREATE TABLE `count` (i
INT);
Query OK, 0 rows affected (0.00 sec)
IGNORE_SPACE
Режим SQL применяется к встроенным функциям, не к определяемым пользователем функциям или
сохраненным функциям. Всегда допустимо иметь пробелы после UDF или сохраненного имени функции,
независимо от ли IGNORE_SPACE
включается.
Для дальнейшего обсуждения IGNORE_SPACE
, см. Раздел
9.2.4, "Парсинг имени функции и Разрешение".
Предотвратите GRANT
оператор от автоматического создания новых пользователей, если
это иначе сделало бы так, если информация об аутентификации не определяется. Оператор должен
определить непустое использование пароля IDENTIFIED BY
или
использование плагина аутентификации IDENTIFIED WITH
.
NO_AUTO_VALUE_ON_ZERO
влияет на обработку AUTO_INCREMENT
столбцы. Обычно, Вы генерируете следующий порядковый номер для столбца, вставляя также NULL
или 0
в это. NO_AUTO_VALUE_ON_ZERO
подавляет это поведение для 0
так, чтобы только NULL
генерирует
следующий порядковый номер.
Этот режим может быть полезным если 0
был сохранен в таблице AUTO_INCREMENT
столбец. (Хранение 0
не
рекомендуемая практика, между прочим.) Например, если Вы выводите таблицу с mysqldump и затем перезагружаете это, MySQL
обычно генерирует новые порядковые номера, когда это встречается 0
значения, приводящие к таблице с содержанием, отличающимся от того, который был выведен. Включение
NO_AUTO_VALUE_ON_ZERO
прежде, чем перезагрузить файл дампа решает
эту проблему. mysqldump
теперь автоматически включает в его вывод оператор, который включает NO_AUTO_VALUE_ON_ZERO
, избегать этой проблемы.
Отключите использование символа наклонной черты влево ("\
") как символ ESC в пределах
строк. С этим включенным режимом наклонная черта влево становится обычным символом как любой другой.
Составляя таблицу, проигнорируйте все INDEX DIRECTORY
и DATA DIRECTORY
директивы. Эта опция полезна на ведомых серверах
репликации.
Управляйте автоматической заменой механизма хранения значения по умолчанию когда оператор такой как
CREATE TABLE
или ALTER TABLE
определяет механизм хранения, который отключается или
не компилируется в.
Поскольку механизмы хранения могут быть сменными во времени выполнения, недоступные механизмы обрабатываются тот же самый путь:
С NO_ENGINE_SUBSTITUTION
отключенный, для CREATE TABLE
механизм значения по умолчанию используется, и
предупреждение происходит, если требуемый механизм недоступен. Для ALTER TABLE
, предупреждение происходит, и таблица не изменяется.
С NO_ENGINE_SUBSTITUTION
включенный, ошибка происходит, и таблица не
составляется или изменяется, если требуемый механизм недоступен.
Не печатайте специфичные для MySQL опции столбца в выводе SHOW CREATE TABLE
. Этот режим используется mysqldump в режиме мобильности.
Не печатайте специфичный для MySQL, индексируют опции в выводе SHOW CREATE TABLE
. Этот режим используется mysqldump в режиме мобильности.
Не печатайте специфичные для MySQL табличные опции (такой как ENGINE
) в
выводе SHOW CREATE TABLE
.
Этот режим используется mysqldump в режиме мобильности.
По умолчанию вычитание между целочисленными операндами производит UNSIGNED
закончитесь, если какой-либо операндUNSIGNED
.
Когда NO_UNSIGNED_SUBTRACTION
включается, результат вычитания
подписывается, даже если какой-либо операнд без знака.
Например, сравните тип столбца c2
в таблице t1
с тем из столбца c2
в таблице t2
:
mysql>SET sql_mode='';
mysql>CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
mysql>CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
mysql>DESCRIBE t1;
+-------+---------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------------------+------+-----+---------+-------+| c2 | bigint(21) unsigned | | | 0 | |+-------+---------------------+------+-----+---------+-------+mysql>SET sql_mode='NO_UNSIGNED_SUBTRACTION';
mysql>CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
mysql>DESCRIBE t2;
+-------+------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| c2 | bigint(21) | | | 0 | |+-------+------------+------+-----+---------+-------+
Отметьте, что это означает это BIGINT UNSIGNED
не на 100 % применимо во
всех контекстах. См. Раздел 12.10, "Функции
броска и Операторы".
mysql>SET sql_mode = '';
mysql>SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+| CAST(0 AS UNSIGNED) - 1 |+-------------------------+| 18446744073709551615 |+-------------------------+mysql>SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql>SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+| CAST(0 AS UNSIGNED) - 1 |+-------------------------+| -1 |+-------------------------+
В строгом режиме не разрешать '0000-00-00'
как допустимая дата. Можно
все еще вставить нулевые даты с IGNORE
опция. Если не в строгом режиме,
дата принимается, но предупреждение сгенерировано.
В строгом режиме не принимайте даты, где часть года является ненулевой, но часть месяца или дня 0
(например, '0000-00-00'
является законным, но '2010-00-01'
и '2010-01-00'
не). Если использующийся с IGNORE
опция, MySQL вставляет a '0000-00-00'
дата любой такой даты. Если не в строгом режиме, дата
принимается, но предупреждение сгенерировано.
Не разрешайте запросы для который список выборки или HAVING
список или
ORDER BY
список обращается к неагрегированным столбцам, которые не
называют в GROUP BY
пункт.
Следующие запросы недопустимы с ONLY_FULL_GROUP_BY
включенный. Первое недопустимо потому что address
в списке выборки не называется в GROUP
BY
пункт, и второе, потому что max_age
в HAVING
пункт не называют в GROUP BY
пункт:
mysql> SELECT name, address, MAX(age)
FROM t GROUP BY name;
ERROR 1055 (42000): 't.address' isn't in GROUP BY
mysql>SELECT name, MAX(age) AS max_age FROM t GROUP BY name
->HAVING max_age < 30;
Empty set (0.00 sec)ERROR 1463 (42000): Non-grouping field 'max_age' is used in HAVING clause
Во втором примере запрос мог быть переписан, чтобы использовать HAVING
MAX(age)
вместо этого, так, чтобы ссылка была к столбцу, названному в агрегатной функции.
(max_age
сбои, потому что это -
агрегатная функция.)
Кроме того, если у запроса есть агрегатные функции и нет GROUP BY
пункт, это не могло неагрегировать столбцы в списке выборки или ORDER
BY
список:
mysql> SELECT name, MAX(age) FROM
t;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)with no GROUP columns is illegal if there is no GROUP BY clause
Для получения дополнительной информации см. Раздел
12.17.3, "MySQL Extensions к GROUP BY
".
По умолчанию конечные пробелы обрезаются от CHAR
значения столбцов на извлечении. Если PAD_CHAR_TO_FULL_LENGTH
включается, обрезка не происходит и
полученный CHAR
значения дополняются к их полному. Этот режим не применяется к VARCHAR
столбцы, для которых конечные пробелы сохраняются на
извлечении.
mysql>CREATE TABLE t1 (c1 CHAR(10));
Query OK, 0 rows affected (0.37 sec)mysql>INSERT INTO t1 (c1) VALUES('xy');
Query OK, 1 row affected (0.01 sec)mysql>SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)mysql>SELECT c1, CHAR_LENGTH(c1) FROM t1;
+------+-----------------+| c1 | CHAR_LENGTH(c1) |+------+-----------------+| xy | 2 |+------+-----------------+1 row in set (0.00 sec)mysql>SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)mysql>SELECT c1, CHAR_LENGTH(c1) FROM t1;
+------------+-----------------+| c1 | CHAR_LENGTH(c1) |+------------+-----------------+| xy | 10 |+------------+-----------------+1 row in set (0.00 sec)
Обработка ||
как
оператор конкатенации строк (то же самое как CONCAT()
) а не как синоним для OR
.
Обработка REAL
как синоним для FLOAT
. По умолчанию, обработки MySQL REAL
как синоним для DOUBLE
.
Включите строгому режиму для всех механизмов хранения. Отклоняются недопустимые значения данных. Дополнительная деталь следует.
Включите строгому режиму для транзакционных механизмов хранения, и когда возможный для нетранзакционных механизмов хранения. Дополнительные детали следуют.
Строгий режим управляет, как MySQL обрабатывает входные значения, которые являются недопустимыми или
недостающими. Значение может быть недопустимым по нескольким причинам. Например, у этого мог бы быть
неправильный тип данных для столбца, или это могло бы испытать недостаток диапазона. Значение отсутствует, когда
новая строка, которая будет вставлена, не содержит значение для не -NULL
столбец,
который имеет не явный DEFAULT
пункт в его определении. (Для a NULL
столбец, NULL
вставляется, если значение
отсутствует.)
Для транзакционных таблиц ошибка происходит для недопустимых или отсутствующих значений в операторе когда любой
из STRICT_ALL_TABLES
или STRICT_TRANS_TABLES
режимы включаются. Оператор прерывается и откатывается.
Для нетранзакционных таблиц поведение является тем же самым или для режима, если плохое значение происходит в первой строке, которая будет вставлена или обновлена. Оператор прерывается, и таблица остается неизменной. Если оператор вставляет или изменяет многократные строки, и плохое значение происходит во второй или более поздней строке, результат зависит, на котором включается строгая опция:
Для STRICT_ALL_TABLES
, MySQL возвращает ошибку и игнорирует остальную часть
строк. Однако, в этом случае, более ранние строки все еще были вставлены или обновлены. Это означает,
что Вы могли бы получить частичное обновление, которое не могло бы быть тем, что Вы хотите. Чтобы
избежать этого, лучше использовать операторы единственной строки, потому что они могут быть прерваны, не
изменяя таблицу.
Для STRICT_TRANS_TABLES
, MySQL преобразовывает недопустимое значение в самое
близкое допустимое значение для столбца, и вставьте скорректированное значение. Если значение
отсутствует, MySQL вставляет неявное значение по умолчанию для типа данных столбца. В любом случае MySQL
генерирует предупреждение, а не ошибку и продолжает обрабатывать оператор. Неявные значения по умолчанию
описываются в Разделе 11.5, "Значения по умолчанию Типа
данных".
Строгий режим отвергает недопустимые значения даты такой как '2004-04-31'
. Это не
отвергает даты с нулевыми частями месяца или дня такой как '2004-04-00'
или "нулевые" даты. Чтобы отвергнуть их также,
включите NO_ZERO_IN_DATE
и NO_ZERO_DATE
Режимы SQL в дополнение к строгому режиму.
Если Вы не используете строгий режим (то есть, ни один STRICT_TRANS_TABLES
ни STRICT_ALL_TABLES
включается), MySQL вставляет скорректированные значения для
недопустимых или отсутствующих значений и производит предупреждения. В строгом режиме можно произвести это
поведение при использовании INSERT IGNORE
или UPDATE IGNORE
. См. Раздел
13.7.5.39,"SHOW WARNINGS
Синтаксис".
Строгий режим не влияет, проверяются ли ограничения внешнего ключа. foreign_key_checks
может использоваться для этого. (См. Раздел
5.1.4, "Системные Переменные Сервера".)
Следующие специальные режимы обеспечиваются как сокращение для комбинаций значений режима от предыдущего списка.
Описания включают все значения режима, которые доступны в новой версии MySQL. Для более старых версий режим комбинации не включает отдельные значения режима, которые не доступны кроме в более новых версиях.
Эквивалентный REAL_AS_FLOAT
, PIPES_AS_CONCAT
, ANSI_QUOTES
, IGNORE_SPACE
.
ANSI
режим также заставляет сервер возвращать ошибку для запросов где функция множества S
с внешней ссылкой
не может быть агрегирован во внешнем запросе, против которого была разрешена внешняя ссылка. Это -
такой запрос: S
(outer_ref
)
SELECT * FROM t1 WHERE t1.a IN (SELECT MAX(t1.b) FROM t2 WHERE ...);
Здесь, MAX(t1.b)
не может агрегированный во внешнем запросе, потому что это появляется в WHERE
пункт того запроса. Стандартный SQL требует ошибки в этой
ситуации. Если ANSI
режим не включается, обработки сервера
в таких запросах тот же самый
способ, которым это интерпретировало бы S
(outer_ref
)
. S
(const
)
Эквивалентный PIPES_AS_CONCAT
, ANSI_QUOTES
, IGNORE_SPACE
, NO_KEY_OPTIONS
, NO_TABLE_OPTIONS
, NO_FIELD_OPTIONS
.
Эквивалентный PIPES_AS_CONCAT
, ANSI_QUOTES
, IGNORE_SPACE
, NO_KEY_OPTIONS
, NO_TABLE_OPTIONS
, NO_FIELD_OPTIONS
, NO_AUTO_CREATE_USER
.
Эквивалентный PIPES_AS_CONCAT
, ANSI_QUOTES
, IGNORE_SPACE
, NO_KEY_OPTIONS
, NO_TABLE_OPTIONS
, NO_FIELD_OPTIONS
.
Эквивалентный NO_FIELD_OPTIONS
, HIGH_NOT_PRECEDENCE
.
Эквивалентный NO_FIELD_OPTIONS
, HIGH_NOT_PRECEDENCE
.
Эквивалентный PIPES_AS_CONCAT
, ANSI_QUOTES
, IGNORE_SPACE
, NO_KEY_OPTIONS
, NO_TABLE_OPTIONS
, NO_FIELD_OPTIONS
, NO_AUTO_CREATE_USER
.
Эквивалентный PIPES_AS_CONCAT
, ANSI_QUOTES
, IGNORE_SPACE
, NO_KEY_OPTIONS
, NO_TABLE_OPTIONS
, NO_FIELD_OPTIONS
.
Эквивалентный STRICT_TRANS_TABLES
, STRICT_ALL_TABLES
, NO_ZERO_IN_DATE
, NO_ZERO_DATE
, ERROR_FOR_DIVISION_BY_ZERO
, NO_AUTO_CREATE_USER
, и NO_ENGINE_SUBSTITUTION
.