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

标签 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,限制为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/

相关文章:

php - pdo mysql 将一个查询插入两次

mySQL 根据条件更新两列

mysql - Carrierwave无法保存图像,使用引擎

php - 为什么 MySQL 的 LEFT JOIN 在使用 WHERE 子句时返回 "NULL"条记录?

php - 如何在 PHP 中实现基本的 "Most Popular Post"脚本?

Mysql - 从字符串中删除字符串模式

mysql - excel VBA更新SQL中的现有记录

mysql - 如何在codeigniter中编写CHAR_LENGTH sql查询

php - 将 mysql 架构添加到 MySQL Workbench?

mysql - 如何使用phpmyadmin将csv数据导入wordpress数据库?