我有一个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,限制为10;
+------------+
| student_id |
+------------+
| 1546 |
| 1660 |
| 2207 |
| 2349 |
| 3123 |
| 3208 |
| 3319 |
| 3811 |
| 3837 |
| 3842 |
+------------+
设置10行(0.02秒)
mysql>从student_import_record限制10中选择student_id;
+------------+
| student_id |
+------------+
| 0001546 |
| 0001660 |
| 0002207 |
| 0002349 |
| 0003123 |
| 0003208 |
| 0003319 |
| 0003811 |
| 0003837 |
| 0003842 |
+------------+
设置10行(0.00秒)
最佳答案
看来您已经知道发生了什么。为了解决这个问题,下面的链接解释了表达式求值中的类型转换:https://dev.mysql.com/doc/refman/5.5/en/type-conversion.html
当运算符与不同类型的操作数一起使用时,请键入
进行转换以使操作数兼容。一些转换
隐式发生。例如,MySQL自动将数字转换为
必要时输入字符串,反之亦然。
mysql> SELECT 1+'1';
-> 2
就您而言,MySQL可能会在
WHERE
子句中看到算术运算,并在该列中隐式转换为整数。我的建议是,如果可能的话,以这种方式构造表:数字在数字列中,非数字数据在其适当列中。当内容混合时,您可以强制数据成为字符。
关于mysql - 当存在WHERE子句时,为什么MySQL将varchar强制转换为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725204/