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.