mysql相关基础问题
- 一、mysql中int类型单引号问题
- 二、静态SQL与动态SQL
- 1. 静态SQL
- 2. 动态SQL
- 3. 动态SQL与静态SQL的区别与联系
一、mysql中int类型单引号问题
今天写mysql的时候发现了一个问题,在查询的时候不小心把int类型的id加上引号查询了,但是也能查询出来,
SELECT * FROM `account` WHERE aid='1';
于是查询了很多资料,最后得出的结论是,mysql会自动转换:当你类型为int 但传入的值为varchar 他会把前几个’数字挑出来’
转换为int 类型来进行查询
如果你的 aid = 1 你查询语句是SELECT * FROM 表名 WHERE aid=‘1dasd’;
在编译的时候,编译器会把 1 挑出来进行转换,在进行查询,
如果你的 aid = 1 你查询语句是SELECT * FROM 表名 WHERE aid=‘dasd’;
第一个不为数字,所以无法转换,查询出来的结果就为空(不会报错),
如果你的 aid = 1 你查询语句是SELECT * FROM 表名 WHERE aid=‘123da’;
在编译的时候,编译器会把 123 挑出来进行转换,在进行查询,但查询结果为空(找不到这个对应的id);
如果你的 aid = 1 你查询语句是SELECT * FROM 表名 WHERE aid=‘da1sd’;
查询结果为空,因为编译期是从第一个开始查看是否为数字,如果不是不会往后查;
二、静态SQL与动态SQL
1. 静态SQL
select * from customers;
2. 动态SQL
DECLARE @SQL AS VARCHAR(100);
DECLARE @CusID1 AS VARCHAR(2);
DECLARE @Column AS VARCHAR(20);
SET @Column = '姓名,省份';
SET @CusID1 = '1';
SET @SQL = 'SELECT' + @Column = 'FROM Customers where 客户ID = ' + @CusID1;
EXEC(@SQL);
3. 动态SQL与静态SQL的区别与联系
我发现网上大部分文章的作者,对这个问题的解释大体一致,要么就是复制粘贴,要么就是囫囵吞枣,除了官方解释和抽象的理论,就没有一点是人能看懂的。
区分动态SQL与静态SQL:看下面三种情况
SELECT * FROM student WHERE name = 'John'
<select id = "selectByName" resultType = "student" parameterType = "String">
SELECT * FROM student WHERE name = #{name}
</select>
DECLARE @SQL AS VARCHAR(100);
DECLARE @CusID1 AS VARCHAR(2);
DECLARE @Column AS VARCHAR(20);
SET @Column = '姓名,省份';
SET @CusID1 = '1';
SET @SQL = 'SELECT' + @Column = 'FROM Customers where 客户ID = ' + @CusID1;
EXEC(@SQL);
分析上述三种情况
- 第一种情况,不需要传入任何参数,SQL语句完全不变,纯纯的静态SQL;
- 第二种情况,需要传入name参数,但是SQL语句整体框架不变,也属于静态SQL;
- 第三种情况,需要传入表名和参数值,改变了SQL语句整体框架,属于动态SQL;
总结:动态SQL与静态SQL的区别
能传入字段的数值的SQL语句不一定是动态SQL,能改变结构的SQL语句一定是动态SQL;