Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MySQL在存在WHERE子句时将varchar转换为整数?_Mysql - Fatal编程技术网

为什么MySQL在存在WHERE子句时将varchar转换为整数?

为什么MySQL在存在WHERE子句时将varchar转换为整数?,mysql,Mysql,我有一个MySQL数据库表,student\u import\u record,其中有一个student\u id varchar(50)字段,可以包含字母数字数据 当我运行此选择语句时: select student_id from student_import_record; 我得到了预期的VARCHAR结果: 0001546 0001660 0002207 0002349 但是,当我运行带有WHERE子句的SELECT语句时: select student_id from studen

我有一个MySQL数据库表,
student\u import\u record
,其中有一个
student\u id varchar(50)
字段,可以包含字母数字数据

当我运行此
选择
语句时:

select student_id from student_import_record;
我得到了预期的
VARCHAR
结果:

0001546
0001660
0002207
0002349
但是,当我运行带有
WHERE
子句的
SELECT
语句时:

select student_id from student_import_record where student_import_id = 185;
我得到的结果似乎被转换为整数:

1546
1660
2207
2349
当使用
WHERE
子句时,如何防止此强制转换

完整表架构:

mysql>描述学生\导入\记录;
+--------------------+--------------+------+-----+---------+----------------+
|字段|类型|空|键|默认|额外|
+--------------------+--------------+------+-----+---------+----------------+
|id | int(11)| NO | PRI | NULL |自动增量|
|学生id | varchar(50)|否|空||
|关系| varchar(50)| NO | | NULL ||
|出生日期| varchar(50)|否|无效||
|名字| varchar(255)| NO | | NULL ||
|姓氏| varchar(255)| NO | | NULL ||
|性别| varchar(10)|否|空||
|学生类型| varchar(50)|是| |空||
|电子邮件| varchar(255)|是| |空||
|电话| varchar(20)|是| |空||
|地址| varchar(255)|是| |空||
|地址2 | varchar(255)|是| |空||
|城市|瓦尔查尔(255)|是| |空||
|状态| varchar(50)|是| |空||
|zip | varchar(50)| YES | | NULL ||
|命令| varchar(10)|是| |无效||
|ssn | varchar(11)|是| |空||
|后缀| varchar(20)| YES | | NULL ||
|部门| varchar(50)|是| |空||
|密码| varchar(255)|是| |空||
|收益1 | varchar(255)|是| |空||
|收益2 | varchar(255)|是| |空||
|收益3 | varchar(255)|是| |空||
|收益4 | varchar(255)|是| |空||
|收益5 | varchar(255)|是| |空||
|收益6 | varchar(255)|是| |空||
|plan1 | varchar(255)|是| |空||
|计划2 | varchar(255)|是| |空||
|plan3 | varchar(255)|是| |空||
|计划4 | varchar(255)|是| |空||
|plan5 | varchar(255)|是| |空||
|plan6 | varchar(255)|是| |空||
|账户| int(11)| NO | | NULL ||
|注册|配置| int(11)|否|空||
|在|日期时间|是|空|导入||
|更新时间为|日期时间|是|空||
|状态| smallint(6)|是| |空||
|状态描述| longblob |是| |空||
|学生|导入| id | int(11)|否|空||

结果集

mysql>从student\u import\u记录中选择student\u id,其中student\u import\u id=10;

+------------+
|学生证|
+------------+
| 1546       |
| 1660       |
| 2207       |
| 2349       |
| 3123       |
| 3208       |
| 3319       |
| 3811       |
| 3837       |
| 3842       |
+------------+
一组10行(0.02秒)

mysql>从student\u import\u记录限制10中选择student\u id;

+------------+
|学生证|
+------------+
| 0001546    |
| 0001660    |
| 0002207    |
| 0002349    |
| 0003123    |
| 0003208    |
| 0003319    |
| 0003811    |
| 0003837    |
| 0003842    |
+------------+

集合中有10行(0.00秒)

看起来您已经知道发生了什么。为了解决这个问题,这里有一个链接解释表达式求值中的类型转换:

当运算符与不同类型的操作数一起使用时,键入 发生转换以使操作数兼容。一些转换 含蓄地发生。例如,MySQL自动将数字转换为 字符串,反之亦然


在您的例子中,MySQL可能在
WHERE
子句中看到算术运算,并在该列中执行对整数的隐式转换。我的建议是,如果可能的话,以数字在数字列中,非数字数据在其相应列中的方式构造表。当存在混合内容时,您可以强制数据为字符。

看起来您已经知道发生了什么。为了解决这个问题,这里有一个链接解释表达式求值中的类型转换:

当运算符与不同类型的操作数一起使用时,键入 发生转换以使操作数兼容。一些转换 含蓄地发生。例如,MySQL自动将数字转换为 字符串,反之亦然

在您的例子中,MySQL可能在
WHERE
子句中看到算术运算,并执行到inte的隐式转换
mysql> SELECT 1+'1';
        -> 2