13.7.5.40 Отображение предупреждений (SHOW WARNINGS)
SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW COUNT(*) WARNINGS
SHOW WARNINGS — это диагностическое оператор, отображающий информацию о состояниях (ошибки, предупреждения и заметки), возникших в результате выполнения оператора в текущем сеансе. Предупреждения генерируются для операторов DML, таких как INSERT, UPDATE и LOAD DATA, а также для операторов DDL, таких как CREATE TABLE и ALTER TABLE.
Клауза LIMIT имеет тот же синтаксис, что и для оператора SELECT. См. Раздел 13.2.9, «Оператор SELECT».
SHOW WARNINGS также используется после оператора EXPLAIN для отображения расширенной информации, генерируемой оператором EXPLAIN. См. Раздел 8.8.3, «Расширенный формат вывода EXPLAIN».
SHOW WARNINGS отображает информацию о состояниях, возникших в результате выполнения последнего недиагностического оператора в текущем сеансе. Если последний оператор привел к ошибке во время парсинга, SHOW WARNINGS отображает возникшие состояния, независимо от типа оператора (диагностический или недиагностический).
Диагностический оператор SHOW COUNT(*)
WARNINGS отображает общее количество ошибок, предупреждений и заметок. Вы также можете получить это число из системной переменной warning_count:
SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;
Разница между этими операторами заключается в том, что первый — диагностический оператор, не очищающий список сообщений. Второй, так как он является оператором SELECT, считается недиагностическим и очищает список сообщений.
Связанный диагностический оператор SHOW
ERRORS отображает только условия ошибок (исключая предупреждения и заметки), а оператор SHOW COUNT(*)
ERRORS отображает общее количество ошибок. См. Раздел 13.7.5.17, «Отображение ошибок (SHOW ERRORS)». GET
DIAGNOSTICS может быть использован для проверки информации об отдельных состояниях. См. Раздел 13.6.7.3, «Оператор GET DIAGNOSTICS».
Ниже приведен простой пример, демонстрирующий предупреждения о преобразовании данных для оператора INSERT. Пример предполагает, что строгий режим SQL отключен. При включенном строгом режиме предупреждения будут переходить в ошибки и прекращать выполнение оператора INSERT.
mysql> CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4));
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO t1 VALUES(10,'mysql'), (NULL,'test'), (300,'xyz');
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 3
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1265
Message: Data truncated for column 'b' at row 1
*************************** 2. row ***************************
Level: Warning
Code: 1048
Message: Column 'a' cannot be null
*************************** 3. row ***************************
Level: Warning
Code: 1264
Message: Out of range value for column 'a' at row 3
3 rows in set (0.00 sec)
Системная переменная max_error_count управляет максимальным количеством сообщений об ошибках, предупреждениях и заметках, для которых сервер хранит информацию, и, следовательно, количеством сообщений, отображаемых оператором SHOW
WARNINGS. Чтобы изменить количество сообщений, которые может хранить сервер, измените значение max_error_count. По умолчанию значение равно 64.
max_error_count управляет только количеством хранимых сообщений, а не количеством учтённых. Значение warning_count не ограничено max_error_count, даже если количество сгенерированных сообщений превышает max_error_count. Следующий пример демонстрирует это. Оператор ALTER
TABLE генерирует три предупреждения (строгий режим SQL отключен для примера, чтобы избежать ошибки после одной проблемы преобразования). Только одно сообщение хранится и отображается, поскольку max_error_count установлено в 1, но все три подсчитываются (как показано значением warning_count):
mysql> SHOW VARIABLES LIKE 'max_error_count';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_error_count | 64 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> SET max_error_count=1, sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER TABLE t1 MODIFY b CHAR;
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 3
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1263 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @@warning_count;
+-----------------+
| @@warning_count |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.01 sec)
Чтобы отключить хранение сообщений, установите max_error_count в 0. В этом случае warning_count по-прежнему указывает, сколько предупреждений произошло, но сообщения не сохраняются и не могут быть отображены.
Системная переменная sql_notes управляет тем, увеличивают ли сообщения-заметки значение warning_count и хранит ли их сервер. По умолчанию sql_notes равно 1, но если установить его в 0, заметки не увеличивают warning_count и сервер не сохраняет их:
mysql> SET sql_notes = 1;
mysql> DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+-------+------+------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------+
| Note | 1051 | Unknown table 'test.no_such_table' |
+-------+------+------------------------------------+
1 row in set (0.00 sec)
mysql> SET sql_notes = 0;
mysql> DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW WARNINGS;
Empty set (0.00 sec)
Сервер MySQL отправляет каждому клиенту счётчик, указывающий общее количество ошибок, предупреждений и заметок, возникших в результате последнего оператора, выполненного этим клиентом. Из API C это значение можно получить, вызвав . См. .
В клиенте mysql вы можете включить и отключить автоматическое отображение предупреждений, используя команды warnings и nowarning соответственно, или их сокращённые варианты, \W и \w (см. Раздел 4.5.1.2, «Команды клиента mysql»). Например:
mysql> \W
Show warnings enabled.
mysql> SELECT 1/0;
+------+
| 1/0 |
+------+
| NULL |
+------+
1 row in set, 1 warning (0.03 sec)
Warning (Code 1365): Division by 0
mysql> \w
Show warnings disabled.
© 2025 Oracle
Licensed under the GPLv2 License.