问题
数据库中有userinfo_tb
表,表中字段数据如下
执行查询语句1
select * from userinfo_tb where username = '' or 1 = 2
结果如下:
执行查询语句2
SELECT 1,2,3,information_schema.TABLES.table_name FROM information_schema.TABLES WHERE information_schema.TABLES.TABLE_SCHEMA = DATABASE()
结果如下
使用UNION
之后就报错了
select * from userinfo_tb where username = '' or 1 = 2 UNION SELECT 1,2,3,information_schema.TABLES.table_name FROM information_schema.TABLES WHERE information_schema.TABLES.TABLE_SCHEMA = DATABASE();
解决
语句是没问题的,查询的字段数也是相同的,看到网上说是字段编码不一致,就去看了我的数据库和表的字符集和排序规则
都是一样的,后面换了个工具(之前用的Navicat后面换成SQLyog),重新建了一个叫user_tb
的表,在里面加了一样的数据,在字符集核对那里看到编码是utf8_general_ci
没管它,直接在表里面放了和userinfo_tb
一模一样的字段和数据再执行查询
SELECT * FROM user_tb WHERE username = '' OR 1 = 2 UNION
SELECT 1,2,3,information_schema.TABLES.table_name FROM information_schema.TABLES WHERE information_schema.TABLES.TABLE_SCHEMA = DATABASE();
结果如下:
回到我的Navicat刷新之后执行相同的语句,结果如下:
select * from user_tb where username = '' or 1 = 2 UNION SELECT 1,2,3,information_schema.TABLES.table_name FROM information_schema.TABLES WHERE information_schema.TABLES.TABLE_SCHEMA = DATABASE();
对比两张表的结构发现是排序规则的问题?!
尝试把userinfo_tb
中的排序规则改为utf8_general_ci
之后再次执行查询,发现还是有问题( ▼-▼ ):
select * from userinfo_tb where username = '' or 1 = 2 UNION SELECT 1,2,3,information_schema.TABLES.table_name FROM information_schema.TABLES WHERE information_schema.TABLES.TABLE_SCHEMA = DATABASE();
但是在SQLyog
中没有问题
所以这个错还可能是软件的问题……