我有一个MySQL数据库,展示了我想要更好理解的行为.为什么我要搜索插入INT字段的CHAR值?我有一个INT类型的字段,但它似乎能够记录字符值,这怎么可能?
我试图通过使用INT和VARCHAR创建数据库来隔离该问题.我将"TEST1"插入INT值,但仍然可以使用ID字符串值搜索该行.将字符串插入ID值后的警告是
| Warning | 1366 | Incorrect integer value: 'TEST1' for column 'ID' at row 1 |
Run Code Online (Sandbox Code Playgroud)
但我仍然能够搜索这个价值.我想了解为什么这是可能的.
mysql> CREATE TABLE test1(ID int, DATA varchar(255));
Query OK, 0 rows affected (0.18 sec)
mysql> INSERT INTO test1(ID,DATA) VALUES('TEST1', 'TEST1');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> SELECT * FROM test1 WHERE ID = 'TEST1';
+------+-------+
| ID | DATA |
+------+-------+
| 0 | TEST1 |
+------+-------+
1 row in set, 1 warning (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
SELECT之后的警告
| Warning | 1366 | Incorrect integer value: 'TEST1' for column 'ID' at row 1 |
Run Code Online (Sandbox Code Playgroud)
但结果仍然正确.
我希望上面的SELECT找到0结果,但事实并非如此,为什么呢?
回答:
在下面的Asaph的回答和Pekka的评论的帮助下,答案现在显而易见.
在INSERT期间,MySQL无法将字符值插入到INT字段中,因此将其替换为0.同样的事情发生在SELECT期间,因此实际上我在ID = 0上对我正在搜索的任何字符值执行SELECT.
mysql> SELECT * FROM test1 WHERE ID = 'SOMETHING_OTHER_THAN_TEST1';
+------+-------+
| ID | DATA |
+------+-------+
| 0 | TEST1 |
+------+-------+
1 row in set, 1 warning (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
返回与我的初始选择相同的结果,因为它实际上正在运行
SELECT * FROM test1 WHERE ID = 0;
Run Code Online (Sandbox Code Playgroud)
在后端.
在任何情况下,最佳实践似乎是在MySQL配置文件或SQL语句本身中使用sql_mode ='STRICT_ALL_TABLES'.
要为MySQL服务器上的所有SQL查询启用STRICT_ALL_TABLES,您需要在my.cnf文件中的[mysqld]标题下添加以下内容,该文件通常位于/etc/my.cnf中
[mysqld]
...
...
...
sql-mode=STRICT_ALL_TABLES
Run Code Online (Sandbox Code Playgroud)
您可以通过设置STRICT_ALL_TABLES可以在运行中my.cnf或在运行中设置的模式来防止首先插入无意义值:
mysql> SET sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE test1(ID int, DATA varchar(255));
Query OK, 0 rows affected (0.42 sec)
mysql> INSERT INTO test1(ID,DATA) VALUES('TEST1', 'TEST1');
ERROR 1264 (22003): Out of range value adjusted for column 'ID' at row 1
mysql> SELECT * FROM test1 WHERE ID = 'TEST1';
Empty set (0.00 sec)
mysql> SELECT * FROM test1;
Empty set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9471 次 |
| 最近记录: |