为什么要避免在 table 名称中使用特殊字符?

Why avoid special characters in table name?

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

我打算使用这个字符串作为数据库名称的一部分,所以我在研究如何做到这一点。看起来我可以,但绝大多数人的反应是“not do it" and "I'll regret it later.

我可以更改此 ID 以避免使用特殊字符,但我真的很想知道为什么这是禁忌。我发现很多例子都说不要,但实际上没有人解释为什么。我找到的最接近答案的是“it will cause pain in the development cycle

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

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

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

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

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