3

情况:

varchar(20)似乎在 Teradata中静默截断,并且在遇到长度超过 20 个字符的字符串时不会扩展或抱怨......这有点令人惊讶,因为我希望自动扩展列以适应更大的字符串,比如 30 个字符,或者如果遇到更大的字符串,则抛出错误。沉默的截断似乎让我成为世界上最糟糕的事情......

并发症:

对于我的应用程序(原型分析设计),我事先不知道我将在几周内摄取的数据有多大。这似乎排除了使用 varchar(N),除了 max

问题:

所以现在我有几个选择,并且正在寻找一些指导:

Q1。用户错误?我是否误解了一个关键概念varchar(N)

如果这实际上是 Teradata 处理varchar字段的方式,那么

Q2。为什么有人会指定任何内容,varchar(max)尤其是在事先不清楚字段中可能需要存储多少字符的情况下。

Q3。是否存在允许灵活调整字符串大小的不同数据类型——即真正的可变长度字符串?

如果我记得,其他 SQL 方言实现varchar(n)为字符串的建议初始大小,但允许它根据需要扩展以适应所抛出数据字符串的最大长度。Teradata 中是否有类似的数据类型?

(注意:由于我正在对表格进行原型设计,因此我现在不太关心性能效率;更关心允许原型进行的快速但安全的设计。)

4

2 回答 2

2

我不熟悉任何实现 varchar(n) 的 SQL 方言,它的行为与您的建议一样——推荐的初始大小,然后让它增长。这将适用于 Oracle、SQL Server、MySQL 和 Postgres。在所有这些数据库中,varchar(n) 的行为与您在 Teradata 中使用显式类型转换的 SELECT 语句中的行为非常相似。我不相信将较长的字符串放入较短的字符串时会导致截断错误。

正如 Branko 在他的评论中指出的那样,数据修改步骤中的行为是不同的,其中隐式转换确实会导致错误。

我不熟悉 Teradata 的所有细节。在 SQL Server 中,历史上 varchar(max) 和 varchar(8000) 之间存在天壤之别。前者将分配在单独的数据页上,而后者将分配在与数据相同的页上。(在最近的版本中,规则已被修改,因此 varchars 可以溢出数据页。)

换句话说,在使用 varchar(max) 时可能还有其他考虑因素,包括数据如何存储在页面上、如何在页面上构建索引,也许还有其他考虑因素。

我的建议是你选择一个相当大的尺寸,比如 1000 左右,然后让应用程序从那里继续。如果您想要真正的灵活性,请使用 varchar(max)。您还应该通过 Teradata 文档和/或技术联系人调查声明非常大的字符串存在哪些问题。

于 2012-08-23T02:27:23.423 回答
1

Teradata 以两种模式工作:Teradata (BT; .. ET;) 和 ANSI(commit;)。它们有差异列表,其中一个是您在开发过程中遇到的——Teradata 模式允许截断显示数据。相反 - ANSI 禁止这样的截断,所以,你会看到一个错误。要了解这个想法,只需使用简单的示例: create table check_exec_mode (str varchar(5)) ; 从 check_exec_mode 中选择 * ;插入 check_exec_mode 值('123456');如果您在 TMODE(transaction mode)=TERA 中配置您的 teradata 客户端(例如,Teradata Studio Express)的连接,那么您将在表中得到一个截断的行('12345')。将事务模式更改为 ANSI 并执行插入语句,将导致错误“字符串数据右截断”。

于 2015-06-30T17:12:48.917 回答