首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么可以在MySQL int字段中插入字符?

问为什么可以在MySQL int字段中插入字符?
EN

Stack Overflow用户
提问于 2010-02-14 18:20:38
回答 1查看 14.1K关注 0票数 8

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

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

代码语言:javascript
复制
| Warning | 1366 | Incorrect integer value: 'TEST1' for column 'ID' at row 1 |

但我还是能找到那个价值。我想了解为什么这是可能的。

代码语言:javascript
复制
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)

在选择后的警告是

代码语言:javascript
复制
| Warning | 1366 | Incorrect integer value: 'TEST1' for column 'ID' at row 1 |

但结果仍然是正确的。

我希望上面的SELECT能找到0的结果,但事实并非如此,为什么?

答案:

在下面的回答和Pekka的评论的帮助下,答案现在似乎是显而易见的。

在插入期间,MySQL未能将字符值插入INT字段,因此它将其替换为0。在SELECT过程中也发生了同样的事情,因此实际上我在ID =0上为我搜索的任何字符值做了一个SELECT。

代码语言:javascript
复制
mysql> SELECT * FROM test1 WHERE ID = 'SOMETHING_OTHER_THAN_TEST1';
+------+-------+
| ID   | DATA  |
+------+-------+
|    0 | TEST1 |
+------+-------+
1 row in set, 1 warning (0.00 sec)

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

代码语言:javascript
复制
SELECT * FROM test1 WHERE ID = 0;

在后端。

无论如何,最佳实践似乎是在sql_mode配置文件或MySQL语句本身中使用MySQL= 'STRICT_ALL_TABLES‘。

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

代码语言:javascript
复制
[mysqld]
...
...
...
sql-mode=STRICT_ALL_TABLES
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-14 18:28:25

首先,可以通过设置STRICT_ALL_TABLES模式(可以在my.cnf中或动态设置)来防止插入无意义的值:

代码语言:javascript
复制
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)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2262196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档