严格模式以避免类型转换

sha*_*nuo 10 mysql

是否有任何sql模式将返回错误而不是隐式将字符串转换为整数?

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

我期待一条错误消息而不是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)
Run Code Online (Sandbox Code Playgroud)

Rob*_*lin 3

我理解您的担忧,但正是因为这个原因,您永远不应该将 id 设置为0. 从长远来看,我认为您应该在行为之前重新考虑表行,这在理想情况下不是问题。通过一些搜索,我没有找到任何与此相关的内容,这可能是因为除非您将其解决,否则它可能不是问题。

除此之外,您可以读取相关列数据并在 php/whatev 中进行相应操作。COLUMNS从中的表中information_schema,您可以按TABLE_SCHEMA(database) 进行筛选,TABLE_NAMECOLUMN_NAME获取DATATYPE(double)。如果您要更改的列具有特定的DATATYPE,请让脚本在运行 MySQL 查询之前给出错误。

另一种方法是在解析之前转换输入:

if ( ! is_numeric($id))
    $id = 'NULL';
Run Code Online (Sandbox Code Playgroud)

为了防止错误的INSERTs 或UPDATEs,您已经拥有该模式


最后我想不出很多实用的方法来让你所追求的这种严格模式让 MySQL 用户受益。