Spec-Zone.ru › MySQL 8.4

15.7.7.42 Заявление 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. См. Раздел 15.2.13, «Оператор SELECT».

SHOW WARNINGS также используется после EXPLAIN, чтобы отобразить расширенную информацию, сгенерированную EXPLAIN. См. Раздел 10.8.3, «Расширенный формат вывода EXPLAIN».

SHOW WARNINGS отображает информацию о состояниях, возникших в результате выполнения последнего оператора без диагностики в текущем сеансе. Если последний оператор привел к ошибке во время анализа, SHOW WARNINGS отображает получившиеся состояния, независимо от типа оператора (диагностического или недиагностического).

Диагностическое заявление SHOW COUNT(*) WARNINGS отображает общее количество ошибок, предупреждений и заметок. Вы также можете получить это число из системной переменной warning_count:

SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;

Различие в этих операторах заключается в том, что первый является диагностическим оператором, который не очищает список сообщений. Второй, так как он является оператором SELECT, считается недиагностическим и очищает список сообщений.

Связанное диагностическое заявление SHOW ERRORS отображает только состояния ошибок (исключая предупреждения и заметки), а SHOW COUNT(*) ERRORS отображает общее количество ошибок. См. Раздел 15.7.7.18, «Оператор SHOW ERRORS». GET DIAGNOSTICS может использоваться для проверки информации о отдельных состояниях. См. Раздел 15.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.

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 | 1024  |
+-----------------+-------+
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 (см. Раздел 6.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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/show-warnings.html

Spec-Zone.ru

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