【发布时间】:2009-05-14 04:44:52
【问题描述】:
我的数据库中有一个表,它有一个主键,它的数据类型是 varchar(10),但它只存储 5 个字符,所以我想将它的数据类型从 varchar(10) 更改为 varchar(5)丢失任何数据。
目前我正在创建一个临时表,将数据从原始表移动到临时表,然后对其进行更改,最后再次将数据从临时表恢复到主表。
我想知道这个问题是否有其他解决方案?
【问题讨论】:
-
何必呢?在几乎所有的存储引擎中,varchar(5) 使用的存储空间并不比 varchar(10) 少。
-
@kquinn: 正好相反——我知道的每个 DBMS 使用的 VARCHAR(5) 空间都比 VARCHAR(10) 少。在我最了解的 DBMS 中,开销会从 9% 增加到 17%(因为有一个字节用于存储实际长度);我可能会使用 CHAR(5),因为浪费很少。
-
同意,CHAR(5) 在这里听起来最好……但在 MySQL 和 PostgreSQL 中,VARCHAR(5) 和 VARCHAR(10) 将使用相同数量的存储空间,例如字符串 ' A B C D'。在 PG 中它是 5 个字节:一个长度字节(如果长度 > 126 则为 4)加上四个数据(我不 认为 字符串存储为空终止;文档没有说但建议它们不是) . IIRC MySQL 的方式相同,尽管它可能使用 2 字节长度的标头。在这两种情况下,VARCHAR(5) 和 VARCHAR(10) 将在磁盘上为相同的字符串使用相同的空间。
-
@kquinn:重新审视了这个问题 - 我知道你在做什么,是的,分配给 VARCHAR(10) 存储 5 个字节和 VARCHAR(5) 存储 5 个字节的实际磁盘通常是相同。空间分配通常可能不同(在这种情况下是边际的)。同样,我知道的一个系统会确保页面上有足够的空间容纳最大大小的行,如果没有足够的空间,它将使用不同的页面。这对于许多非常长的可变长度字段很重要(例如,当最大实际长度仅为 32 时,VARCHAR(255) 的 6 个字段)。
标签: sql-server database sql-server-2005