【问题标题】:Is OK to enclosing all values in SQL statement with single quotes?可以用单引号将 SQL 语句中的所有值括起来吗?
【发布时间】:2013-03-19 12:47:34
【问题描述】:

可以用单引号将 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' 括起来值,但我很好奇这是否正确,是否存在任何性能问题?

【问题讨论】:

  • 我完全迷路了。你don't have to worry about field datatype?那么这意味着验证会立即消失吗?
  • 在构建多数据库 ORM(或任何您想称呼它的任何名称)时,您当然需要支持不同的语法。不妨从这一点开始 - 另外,请记住 SQLite 具有类型值并且只有松散列 type affinity
  • (当然,当使用占位符/准备好的语句时——每个受人尊敬的数据库适配器都应该支持——语法wrt。引用在很大程度上是无关紧要的,即使类型转换可能仍然适用。)

标签: mysql sql sql-server database tsql


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

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

    最好不要引用数字。

    【讨论】:

      【解决方案3】:

      SELECT ... WHERE int_type = '123' 可以。 SQL 会将'123' 转换为整数一次并完成。

      但是,SELECT ... WHERE char_type = 123 不行,因为 SQL 必须将每个单元格转换为整数。看到 char_type = '0123' 和 char_type = '00123' 也将匹配。所以它必须做更多的工作。

      感谢@MartinSmith 指出了铸造优先的资源:@​​987654321@

      【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-15
        • 2021-01-29
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2010-09-14
        相关资源
        最近更新 更多