Строгий режим, чтобы избежать преобразования типов

Есть ли какой-либо режим sql, который будет возвращать ошибку вместо неявного преобразования строки в целое?

mysql> select * from todel ;
+------+--------+
| id   | name   |
+------+--------+
|    1 | abc    |
|    2 | xyz    |
|    0 | ABCxyz |
+------+--------+
3 rows in set (0.00 sec)

Я ожидаю сообщение об ошибке вместо строки с id 0

mysql> select * from todel where id = 'abc';
+------+--------+
| id   | name   |
+------+--------+
|    0 | ABCxyz |
+------+--------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------+
| Level   | Code | Message                                 |
+---------+------+-----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'abc' |
+---------+------+-----------------------------------------+
1 row in set (0.01 sec)

Ответ 1

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

Кроме того, вы можете прочитать соответствующие данные столбца и действовать соответственно в php/whatev. Из таблицы COLUMNS в information_schema вы можете отфильтровать TABLE_SCHEMA (база данных), TABLE_NAME и COLUMN_NAME, чтобы получить DATATYPE (double). Если столбец, который вы меняете, имеет определенный DATATYPE, пусть script выдаст ошибку перед запуском MySQL-запроса.

Другой способ сделать это - просто преобразовать входные данные перед разбором:

if ( ! is_numeric($id))
    $id = 'NULL';

Чтобы предотвратить неправильные INSERT или UPDATE s, вы уже имеете этот режим.


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

Ответ 2

Вы можете использовать STRICT_ALL_TABLES режим sql:

set @@GLOBAL.sql_mode  = "STRICT_ALL_TABLES";
set @@SESSION.sql_mode = "STRICT_ALL_TABLES";

Однако он работает только на операции записи:

MariaDB [(none)]> insert into test.test values ( "abc", "lol" );
--------------
insert into test.test values ( "abc", "lol" )
--------------

ERROR 1366 (22007): Incorrect integer value: 'abc' for column 'id' at row 1

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