10

是否有任何 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)
4

2 回答 2

3

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

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

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

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

为了防止不正确INSERT的 s 或UPDATEs,你已经有了那个 mode


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

于 2013-09-03T11:20:28.697 回答
2

可以使用STRICT_ALL_TABLESsql模式:

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

没有这样的事情来禁用读取查询的隐式转换;相反,您可以检查是否有警告,如果有,则释放结果,中止语句,并将这些警告威胁为错误。

于 2013-09-19T12:09:44.097 回答