【问题标题】:SQL Server GUID to VarChar(36) or Char(36)?SQL Server GUID 到 VarChar(36) 或 Char(36)?
【发布时间】:2011-04-17 03:19:46
【问题描述】:

我正在替换一些 GUID 列类型,因为我需要在 MSSQL 2008 中做一些 Group By 工作。我正准备将类型更改为 Char(36),因为我知道值的确切大小,但是在谷歌搜索之后有点我看到很多人在做 Varchar(36) 代替。在这种情况下做CHAR不是更好吗?

【问题讨论】:

  • 只是感兴趣。为什么 group by 需要使用varchar/char 而不是uniqueidentifier
  • 对非常大的 URL 数据集进行聚合,并且 URL 由 GUID 别名,需要进行一些分组和求和,而这不能用 Uniqueidentifier AFAIK 完成。
  • 我所做的简单测试显示没有问题。我找到了sqlservercentral.com/articles/Data+Types/…。 SQL Server 2000 中可能是一篇相当老的文章。我在 SQL Server 2005 和 2008 中进行了测试。

标签: sql-server-2008 casting char guid varchar


【解决方案1】:

CHAR 和 VARCHAR 的区别在于空间的分配方式。 CHAR 字段始终是定义的大小,但在 VARCHAR 字段中实际包含数据之前,它将占用 0 个字节。

不过,在您的情况下,因为您总是要存储 36 个字符,所以我建议您继续使用 CHAR。如果您要存储不同长度的数据,请使用 VARCHAR。

但是,您真的要在 GUID 上使用 GROUP BY 吗?出于某种原因,它们被称为“全球唯一标识符”。或者您是否将它们拆分,并按 GUID 的某些部分进行分组(可以相同,但总的来说,没有一个部分是相同的)。

【讨论】:

  • 如果对与该 guid 相关的多条记录求和等,则按 guid 分组是有意义的。
【解决方案2】:

快速回答:使用 CHAR(36) 或更好的 BINARY(16)。

长答案:最好不要单独使用列类型并在查询中使用 CAST。

DECLARE @a TABLE (x UNIQUEIDENTIFIER, y INT)
-- Insert some data here
SELECT
    MIN(y),
    CAST(a.x AS BINARY(16))
FROM
    @a AS a
GROUP BY
    CAST(a.x AS BINARY(16))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2011-01-16
    • 2011-07-02
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多