我有一个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秒)
答案 0 :(得分:0)
看起来你已经知道发生了什么。希望结束这个问题,这是一个解释表达式评估中类型转换的链接:https://dev.mysql.com/doc/refman/5.5/en/type-conversion.html
当运算符与不同类型的操作数一起使用时,请键入 发生转换以使操作数兼容。一些转换 隐含地发生。例如,MySQL会自动将数字转换为 必要的字符串,反之亦然。
mysql> SELECT 1+'1';
-> 2
在您的情况下,MySQL可能会在WHERE
子句中看到算术运算,并在该列中执行隐式转换为整数。我建议如果可能的话,以数字在数字列中的方式构造表,非数字数据在其适当的列中。当存在混合内容时,您可以强制数据为字符。