【问题标题】:Confusion regarding nchar in SQL ServerSQL Server 中关于 nchar 的困惑
【发布时间】:2015-05-27 00:32:04
【问题描述】:

我无法理解下面来自nchar and nvarchar的摘录

上面写着:

nchar [ ( n ) ]

固定长度的 Unicode 字符串数据。 n 定义字符串长度,并且必须是 1 到 4,000 之间的值。存储大小是 n 字节的两倍。当排序规则代码页使用双字节字符时,存储大小仍为 n 字节。根据字符串,n 字节的存储大小可能小于为 n 指定的值。 nchar 的 ISO 同义词是 national char 和 national character..

我在上面的陈述中发现了一些矛盾,例如:

参见第二句,它说存储大小是 n 字节的两倍,在下一句中它说 存储大小仍然是 n 字节。在第一句中它说它具有固定长度,在第四句中它说 n 字节的存储大小可以小于为 n 指定的值。

提前致谢。

【问题讨论】:

  • 最后一个并不矛盾。您可以为 nchar(n) 列分配少于 'n' 个字符。该列仍然占用 2*n 个字节,并且该值实际上被填充为 n 个字符。
  • 我怀疑文档有误。我认为他们的意思是“存储大小仍然是 n 字节的两倍”,因为 nchar 是固定长度。
  • @pmbAustin:我明白你想说什么,其实我也有同样的看法,但是文档说->>> n 字节的存储大小可以小于为 n 指定的值.我认为存储大小应该是固定的,实际上这就是填充的原因。不是吗?
  • NCHAR 是一个固定长度类型 - 它会总是使用定义的尽可能多的字符; NCHAR 是 Unicode 类型,这意味着 每个字符 2 个字节。所以NCHAR(20) 总是会占用 40 个字节
  • @marc_s : 所以需要更正sql server文档:)

标签: sql-server sqldatatypes


【解决方案1】:

基本上,nchar 和 nvarchar 存储 unicode 字符串。
您看到的 n 是将存储在 nchar 列中的字符数,或将存储在 nvarchar 列中的最大字符数。
根据字符串,nchar 的存储大小可能小于 n。由于 nchar 是固定长度的,这意味着它将向比 n 短的字符串添加空格。这意味着如果您将字符串 'h' 存储在 nchar(6) 列中,它将被视为带有 5 个尾随空格的 'h'。我猜后面的空格实际上并没有存储在数据库中,因此存储大小可以小于n。

然而,在 nvarchar 中,情况并非如此。 nvarchar 将始终具有 (n*2) + 2 字节的存储大小。

【讨论】:

  • 你对存储的猜测是我真正的困惑:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2020-03-06
  • 2016-03-16
  • 2013-07-27
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多