为什么要避免表名中的特殊字符?

时间:2016-10-25 15:16:22

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

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

我打算将此字符串用作数据库名称的一部分,因此我正在研究如何执行此操作。它看起来像我可以,但绝大多数的共同反应是" not do it"和" I'll regret it later."

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

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

我知道这存在以意见为基础的风险,因此我非常喜欢一些可量化的理由。

1 个答案:

答案 0 :(得分:1)

问题有两个基本方面。第一个是我们使用的许多程序之间的字母和编码的不同约定。第二个是字符序列和用于表示字符序列的字符之间的差异。

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

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