用单引号括起SQL语句中的所有值是否可以?例如:
这是一本名为books的简单表:
id | title
1 | Some book name
2 | Second book name
写这样的语句是否可以:
SELECT * FROM books WHERE id = '1'
我已经在SQL Server 2008和MySQL 5中测试了该查询并且它运行良好,但我很好奇是否有任何性能问题,因为ID字段是acctualy整数。
第二个问题是写下这样的陈述是可以的:
SELECT * FROM books WHERE id = N'1'
N前缀在SQL服务器中用于UTF-8字段,但我已经在SQL服务器和MySQL中测试过,两者都运行良好。我不知道SQLite是否支持N前缀,因为我没有测试过。
我之所以这样问是因为我正在构建可与流行的SQL数据库(SQL Server,MySQL,SQLite和MS Access)一起使用的数据库类,因此在执行选择,插入或更新数据时,我不这样做不得不担心字段数据类型。我总是可以用N'Some值附加值,但我很好奇这是否正确并且是否存在任何性能问题?
答案 0 :(得分:6)
在SQL Server中,执行此操作时可以获得隐式转换。有时它不会影响计划或对绩效产生明显影响,但有时也可能。他们通常被认为是坏的。检查针对AdventureWorks2012的这两个查询的计划:
SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID = 43659;
SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID = '43659';
后者包含CONVERT_IMPLICIT
(将鼠标悬停在CI搜索的工具提示上)。
您还需要非常小心地在VARCHAR
和NVARCHAR
之间切换 - 在某些情况下,这可能会对性能造成负担,具体取决于基础数据类型以及文字是否具有{{1前缀。
长话短说:不要这样做。编写你的ORM,以便它理解不同的数据类型并适当地处理它们。
答案 1 :(得分:3)
SELECT ... WHERE int_type = '123'
可以。 SQL会将'123'
转换为整数一次并完成它。
但是,SELECT ... WHERE char_type = 123
不行,因为SQL必须将每个单元格转换为整数。看到char_type ='0123'和char_type ='00123'也将匹配。所以它必须做更多的工作。
感谢@MartinSmith在投射中指出了一个优先资源:http://msdn.microsoft.com/en-us/library/ms190309.aspx
答案 2 :(得分:2)
SQL Server和MySQL都执行隐式类型转换,但这并不是一个好习惯;尽可能使用适当的本机类型。这样可以避免尝试发现以下区别:
SELECT * FROM books WHERE id = '1'
和
SELECT * FROM books WHERE id = 'l'
和
SELECT * FROM books WHERE id = 'O'
和
SELECT * FROM books WHERE id = '0'
(这是一个,一个小写的L,一个大写'o'和一个零)
答案 3 :(得分:2)
这是MySQL中的一个示例错误,它说从引用的数字字符串到整数的隐式类型转换会导致严重的性能问题:http://bugs.mysql.com/bug.php?id=43319
最好不引号。