gpt4 book ai didi

mysql - 为什么可以向 MySQL 的 int 字段中插入字符?

转载 作者:可可西里 更新时间:2023-11-01 06:37:05 25 4
gpt4 key购买 nike

我有一个 MySQL 数据库,它表现出我想更好地理解的行为。为什么我可以搜索插入到 INT 字段中的 CHAR 值?我有一个类型为 INT 的字段,但它似乎可以记录字符值,这怎么可能?

我试图通过创建一个包含 INT 和 VARCHAR 的数据库来隔离问题。我将“TEST1”插入到 INT 值中,但仍然能够使用 ID 字符串值搜索该行。将字符串插入ID值后的警告是

| Warning | 1366 | Incorrect integer value: 'TEST1' for column 'ID' at row 1 |

但我仍然能够搜索该值。我想了解为什么这是可能的。

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)

SELECT 后的警告是

| Warning | 1366 | Incorrect integer value: 'TEST1' for column 'ID' at row 1 |

但结果仍然正确。

我希望上面的 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)

返回的结果与我的初始选择相同,因为它确实运行为

SELECT * FROM test1 WHERE ID = 0;

在后端。

在任何情况下,最佳实践似乎是在 MySQL 配置文件或 SQL 语句本身中使用 sql_mode = 'STRICT_ALL_TABLES'。

要为 MySQL 服务器上的所有 SQL 查询启用 STRICT_ALL_TABLES,您需要在通常位于/etc/my.cnf 的 my.cnf 文件中的 [mysqld] header 下添加以下内容

[mysqld]
...
...
...
sql-mode=STRICT_ALL_TABLES

最佳答案

您可以通过设置 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)

关于mysql - 为什么可以向 MySQL 的 int 字段中插入字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2262196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com