Строгий режим, чтобы избежать преобразования типов
Есть ли какой-либо режим 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
Нет такой вещи, чтобы отключать неявные преобразования для запросов на чтение; вместо этого вы можете просто проверить, есть ли предупреждения, и, если да, просто освободите результат, отмените оператор и устраните эти предупреждения как ошибки.