【问题标题】:Do you check your field- and table names against reserved word lists?您是否根据保留字列表检查您的字段和表名称?
【发布时间】:2010-09-12 01:49:31
【问题描述】:

我的字段、表、查看器存储过程名称有时会出现问题。 示例:

   SELECT from, to, rate FROM Table1

问题在于 from 是 SQL-92 中的保留字。 您可以将字段名放在双引号中来解决这个问题,但是如果其他一些数据库工具想要读取您的数据库怎么办? 这是您的数据库设计,如果其他应用程序对您的数据库有问题,那是您的错。

还有很多其他reserved words (~300),我们应该避免所有这些。 如果您将 DBMS 从制造商 A 更改为 B,您的应用程序可能会失败,因为一些字段名现在是保留字。 名为 PERCENT 的字段可能适用于 oracle 数据库,但在 MS SQL Server 上,它必须被视为保留字。

我有一个工具可以对照这些保留字检查我的数据库设计;你也是?

这是我的规则

  1. 不要使用超过 32 个字符的名称(某些 DBMS 无法处理更长的名称)
  2. 只能使用 a-z、A-Z、0-9 和下划线(不允许使用:-;、/&!=?+-)
  3. 名字不要以数字开头
  4. 避免使用这些保留字

【问题讨论】:

    标签: database-design reserved-words


    【解决方案1】:

    简单的方法:只需确保每个字段名称都被引用。

    编辑:任何明智的数据库工具都应该做同样的事情,我当然从未遇到任何问题(至少在我自己的代码之外!)

    【讨论】:

    • 不是一个好主意。无处不在的引号(或许多 Microsoft 工具使用的方括号)严重损害了可读性。
    • 这仅在您编写文字 SQL 时才重要,大多数情况下最好避免
    【解决方案2】:

    当然。为此,我有一个 SQL_RESERVED_WORDS 表。

    Oracle 只能处理 30 个字符的表名 BTW。而且都是大写的。

    只需要一个小时的不必要的调试就可以收回成本。

    【讨论】:

      【解决方案3】:

      您不应该使用保留字作为表中的列名,即使您可以将它们引用。

      引用它们会使代码变得非常尴尬,因为您必须在代码中的 SQL 语句中一直对引号字符进行转义。在我看来,它还使 SQL 命令行成为真正的 PITA。

      最后它看起来很乱。花时间想出一个不与 SQL 关键字冲突的不同单词要好得多。

      我觉得你的规则很好。

      【讨论】:

        【解决方案4】:

        避免保留字。

        请注意,大多数数据库(和数据库链接层)都有一种以编程方式列出所有保留字的方法。您可以将其用作应用程序启动时的健全性检查,以确保您没有误入歧途。

        引用确实有效,因此您可以这样做以确保安全。但是,对于 DBA 和针对您的应用制作自定义报告的人来说,这让生活变得非常尴尬,因此只能将其用作创可贴。

        【讨论】:

          【解决方案5】:

          抛开名称和保留字之间明显的混淆,我认为至少有两个非常充分的理由避免使用保留字作为名称:

          1. 您不必使用会严重损害可读性的引号(或 MS 世界中的方括号)。

            注意:当您发现自己需要从 SQL(所谓的“动态 SQL”方法)或其他语言生成 SQL 代码时,可读性可能会特别受损。您不希望在单引号中包含额外的双引号,或者额外的重复双引号,或转义引号,或任何其他类似的晦涩内容。

            例如,你喜欢这样的 sn-ps:

            -- SQL -----------------------
            declare @sql as varchar(4000)
            set @sql = 'select "To", "From" from MyTable'
            
            ' VB -------------------------
            Dim sql as String
            sql = "select ""To"", ""From"" from MyTable"
            
            // C++ -----------------------
            String sql = "select \"To\", \"From\" from MyTable"
            
          2. 无论如何,大多数保留字都不适合命名表、列、变量等。在绝大多数情况下,名词(有时是形容词)比动词、副词和介词更适合命名。 :-)

          【讨论】:

            【解决方案6】:

            我同意 Yarik 关于保留字适用性的第二点。在 OP 示例中,他使用“to”、“from”和“rate”。我脑海中最直接的问题,因此也可能是未来开发者的问题,是“去往和来自什么?”也许考虑将这些列重命名为“EffectiveFromDate”和“EffectiveUntilDate”,如果它们代表的是这样的话。

            2c>

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-25
              • 2019-01-12
              • 1970-01-01
              • 2011-03-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多