简体   繁体   中英

why is MySQL casting varchar as integer when WHERE clause is present?

I have a MySQL database table, student_import_record , with a student_id varchar(50) field that can contain alphanumeric data.

When I run this SELECT statement:

select student_id from student_import_record;

I get the VARCHAR results as expected:

0001546
0001660
0002207
0002349

But when I run this SELECT statement with a WHERE clause:

select student_id from student_import_record where student_import_id = 185;

I get results that appear to be cast as an integer:

1546
1660
2207
2349

How do I prevent this casting when using a WHERE clause?

Full Table schema: 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> 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 | |

Result sets

mysql> select student_id from student_import_record where student_import_id = 185 limit 10; +------------+ | student_id | +------------+ | 1546 | | 1660 | | 2207 | | 2349 | | 3123 | | 3208 | | 3319 | | 3811 | | 3837 | | 3842 | +------------+ +------------+ | student_id | +------------+ | 1546 | | 1660 | | 2207 | | 2349 | | 3123 | | 3208 | | 3319 | | 3811 | | 3837 | | 3842 | +------------+ 10 rows in set (0.02 sec)

mysql> select student_id from student_import_record limit 10; +------------+ | student_id | +------------+ | 0001546 | | 0001660 | | 0002207 | | 0002349 | | 0003123 | | 0003208 | | 0003319 | | 0003811 | | 0003837 | | 0003842 | +------------+ +------------+ | student_id | +------------+ | 0001546 | | 0001660 | | 0002207 | | 0002349 | | 0003123 | | 0003208 | | 0003319 | | 0003811 | | 0003837 | | 0003842 | +------------+ 10 rows in set (0.00 sec)

Looks like you have already figured out what was going on. In the hope to close out this question, here's a link that explains type conversion in expression evaluation: https://dev.mysql.com/doc/refman/5.5/en/type-conversion.html

When an operator is used with operands of different types, type conversion occurs to make the operands compatible. Some conversions occur implicitly. For example, MySQL automatically converts numbers to strings as necessary, and vice versa.

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

In your case, MySQL might be seeing arithmetic operation in the WHERE clause and performing implicit conversion to integers in that column. My recommendation is to structure the table, if possible, in a manner that numbers are in numeric column and non-numeric data is in its appropriate column. When there's mixed content, you could force the data to be character.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM