Spec-Zone.ru › MySQL 9.2

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.19, «Оператор 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-9.2-en/show-warnings.html

Spec-Zone.ru

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