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

时间:2015-09-22 19:23:35

标签: mysql

我有一个MySQL数据库表student_import_record,其中student_id varchar(50)字段可以包含字母数字数据。

当我运行此SELECT声明时:

select student_id from student_import_record;

我按预期得到了VARCHAR个结果:

0001546
0001660
0002207
0002349

但是当我使用SELECT子句运行此WHERE语句时:

select student_id from student_import_record where student_import_id = 185;

我得到的结果似乎是一个整数:

1546
1660
2207
2349

如何在使用WHERE子句时阻止此播放?

全表架构: mysql> describe student_import_record; +--------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | student_id | varchar(50) | NO | | NULL | | | relationship | varchar(50) | NO | | NULL | | | date_of_birth | varchar(50) | NO | | NULL | | | first_name | varchar(255) | NO | | NULL | | | last_name | varchar(255) | NO | | NULL | | | gender | varchar(10) | NO | | NULL | | | student_type | varchar(50) | YES | | NULL | | | email | varchar(255) | YES | | NULL | | | phone | varchar(20) | YES | | NULL | | | address | varchar(255) | YES | | NULL | | | address2 | varchar(255) | YES | | NULL | | | city | varchar(255) | YES | | NULL | | | state | varchar(50) | YES | | NULL | | | zip | varchar(50) | YES | | NULL | | | mandate | varchar(10) | YES | | NULL | | | ssn | varchar(11) | YES | | NULL | | | suffix | varchar(20) | YES | | NULL | | | department | varchar(50) | YES | | NULL | | | password | varchar(255) | YES | | NULL | | | benefit1 | varchar(255) | YES | | NULL | | | benefit2 | varchar(255) | YES | | NULL | | | benefit3 | varchar(255) | YES | | NULL | | | benefit4 | varchar(255) | YES | | NULL | | | benefit5 | varchar(255) | YES | | NULL | | | benefit6 | varchar(255) | YES | | NULL | | | plan1 | varchar(255) | YES | | NULL | | | plan2 | varchar(255) | YES | | NULL | | | plan3 | varchar(255) | YES | | NULL | | | plan4 | varchar(255) | YES | | NULL | | | plan5 | varchar(255) | YES | | NULL | | | plan6 | varchar(255) | YES | | NULL | | | account | int(11) | NO | | NULL | | | enrollment_config | int(11) | NO | | NULL | | | imported_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | status | smallint(6) | YES | | NULL | | | status_description | longblob | YES | | NULL | | | student_import_id | int(11) | NO | | NULL | |

结果集

的MySQL>从student_import_record中选择student_id,其中student_import_id = 185 limit 10; +------------+ | student_id | +------------+ | 1546 | | 1660 | | 2207 | | 2349 | | 3123 | | 3208 | | 3319 | | 3811 | | 3837 | | 3842 | +------------+ 10行(0.02秒)

的MySQL>从student_import_record limit 10中选择student_id; +------------+ | student_id | +------------+ | 0001546 | | 0001660 | | 0002207 | | 0002349 | | 0003123 | | 0003208 | | 0003319 | | 0003811 | | 0003837 | | 0003842 | +------------+ 10行(0.00秒)

1 个答案:

答案 0 :(得分:0)

看起来你已经知道发生了什么。希望结束这个问题,这是一个解释表达式评估中类型转换的链接:https://dev.mysql.com/doc/refman/5.5/en/type-conversion.html

  

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

mysql> SELECT 1+'1';
        -> 2

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