【问题标题】:Why avoid special characters in table name?为什么要避免表名中的特殊字符?
【发布时间】:2016-10-25 15:16:21
【问题描述】:

我希望在我的应用程序中基于规范化字符串生成一些特殊的存储表(想想用作 id 的 json 字符串)。起初我使用这个项目作为 id,但表变得如此之大,以至于即使是合理的查询也会花费不合理的时间。

我打算将此字符串用作数据库名称的一部分,所以我正在研究如何做到这一点。看起来我可以,但绝大多数常见的回复是“not do it”和“I'll regret it later.

我很好地改变了这个 id,所以我避免使用特殊字符,但我真的很想知道为什么这是如此禁忌。我发现很多例子说不要,但没有人真正解释为什么。我找到的最接近答案的是“it will cause pain in the development cycle

特别是在数据库几乎完全由代码管理的情况下,是否有充分的理由?

我知道这存在基于意见的风险,所以我真的很想要一些可量化的理由。

【问题讨论】:

  • 你的字符串上没有 index 作为 id 吗?
  • 是的,我愿意。这个字符串实际上是用于索引表的 4 个键中的 1 个。
  • create table ????( foo int ) 在 PostgreSQL 中工作,但如果你这样做我会解雇你

标签: database-design character-encoding special-characters naming-conventions string-literals


【解决方案1】:

这个问题有两个基本方面。首先是我们使用的许多程序之间的字母和编码约定不同。二是字符序列和用来表示它的字符序列的区别。

我们在软件开发中的许多程序之间运行输入和输出。它们以各种不同的方式(在输入、处理和输出中)处理字符序列(一些表示字符串,包括符号名称或数据值)。除非在非常有限的情况下,否则其中许多都不能保证有效。因此,如果您想最大程度地减少问题,您应该在字母和编码方面使用尽可能简单的字符序列,包括那些代表名称和字符串的字符序列。

每当表示字符串的字符序列与字符串不同时,我们必须在这两种序列之间进行转换。最简单的情况是序列相同时。下一个最简单的情况是我们可以在一个不能包含它的字符串周围放置一些特殊字符。但除此之外,转换需要调用程序。例如,在 SQL 中,我们可以输入一个不带引号的表名作为其字符。对于一个仅包含字母数字和下划线的 SQL VARCHAR 类型的值的序列,我们可以在它周围加上引号。但是对于这样一个也可以包含引号的 VARCHAR,我们还必须复制其中的任何引号。对于具有任意字符的 VARCHAR,我们必须引入转义字符,包括转义字符。正如我所说,SQL 不带引号的表名约定避免了这些转换问题。

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多