3

可以用单引号将 SQL 语句中的所有值括起来吗?例如:

这是一个简单的表格,称为书籍:

id  |  title
1   |  Some book name
2   |  Second book name

可以这样写语句:

SELECT * FROM books WHERE id = '1'

我已经在 SQL Server 2008 和 MySQL 5 中测试了该查询,它运行良好,但我很好奇是否存在任何性能问题,因为 ID 字段是整数。

第二个问题可以这样写:

SELECT * FROM books WHERE id = N'1'

N 前缀在 SQL Server 中用于 UTF-8 字段,但我已经在 SQL Server 和 MySQL 中对其进行了测试,并且都可以正常工作。我不知道 SQLite 是否支持 N 前缀,因为我没有测试过。

我问这个的原因是因为我正在构建可以与流行的 SQL 数据库(SQL Server、MySQL、SQLite 和 MS Access)一起使用的数据库类,所以在执行选择、插入或更新数据时我不必担心关于字段数据类型。我总是可以用 N'Some value' 括起来值,但我很好奇这是否正确,是否存在任何性能问题?

4

4 回答 4

6

在 SQL Server 中,您可以在执行此操作时获得隐式转换。有时它不会影响计划或对性能有明显影响,但有时可能会。他们通常被认为是坏的。针对 AdventureWorks2012 检查这两个查询的计划:

SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID = 43659;

SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID = '43659';

后者包含一个CONVERT_IMPLICIT(将鼠标悬停在 CI 搜索的工具提示上)。

您还需要非常小心地在VARCHAR和之间切换NVARCHAR- 在某些情况下,这可能会降低性能,具体取决于底层数据类型以及文字是否具有N前缀。

长话短说:不要这样做。编写你的 ORM 东西,以便它理解不同的数据类型并适当地处理它们。

于 2013-03-28T21:52:36.817 回答
4

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

于 2013-03-28T21:48:38.230 回答
2

SQL ServerMySQL都执行隐式类型转换,但这并不是一个好的实践;尽可能使用适当的本机类型。这将使您避免试图发现以下之间的区别:

SELECT * FROM books WHERE id = '1'

SELECT * FROM books WHERE id = 'l'

SELECT * FROM books WHERE id = 'O'

SELECT * FROM books WHERE id = '0'

(分别是 1、小写 L、大写 'o' 和 0)

于 2013-03-28T21:52:59.367 回答
2

这是 MySQL 中的一个示例错误,它说从带引号的数字字符串到整数的隐式类型转换会导致严重的性能问题: http ://bugs.mysql.com/bug.php?id=43319

最好不要引用数字。

于 2013-03-28T22:05:43.677 回答