【问题标题】:Max length of "tzname" field / timezone identifier name“tzname”字段/时区标识符名称的最大长度
【发布时间】:2012-09-14 19:23:19
【问题描述】:

我正在尝试查找时区标识符的最大长度。这是用作时区名称的字符串(例如“America/New_York”)。 tz 数据库没有帮助;我找不到实现细节。

Microsoft (.NET Framework 4.5) suggests a max length of 32,但这似乎是他们注册表的限制。

libc points to a limit called "_POSIX_TZNAME_MAX", which is 3 characters long,但这是 POSIX 合规性的绝对最低要求。通常,我猜一个实现会使用更多。

所以真正的问题是:安全存储时区“tzname”/标识符名称的可接受字符串长度是多少?

【问题讨论】:

  • Microsoft .NET Framework TimeZone.Id 属性适用于与 IANA tzdb 标识符非常不同的 Windows 时区标识符。

标签: database timezone schema


【解决方案1】:

为什么不使用不关心长度的容器——例如std::string?

现在,碰巧我最近正在使用以通用 csv 格式提供的 TZ db(例如,此处为 in a file from Boost),但 Boost 源中也使用了相同的格式。

使用该数据,我看到的最大长度为 28:

R> library(RcppBDT)                      # R package interfacing Boost Date_Time
Loading required package: Rcpp
R> tz <- new(bdtTz, "America/Chicago")   # init. an object, using my default TZ
R> tznames <- tz$getAllRegions()         # retrieve list of all TZ names
R>
R> length(tznames)                       # total number of TZ identifiers
[1] 381
R>
R> head(tznames)                         # look at first six
[1] "Africa/Abidjan"     "Africa/Accra"       "Africa/Addis_Ababa" 
[4] "Africa/Algiers"     "Africa/Asmera"      "Africa/Bamako"     
R>
R> summary(sapply(tznames, nchar))       # numerical summary of length of each
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      9      13      15      15      17      28 
R>
R> tznames[ nchar(tznames) >= 26 ]       # looking at length 26 and above
[1] "America/Indiana/Indianapolis" "America/Kentucky/Louisville"  
[3] "America/Kentucky/Monticello"  "America/North_Dakota/Center" 
R> 

我们也可以看直方图:

R> library(MASS)
R> truehist(sapply(tznames, nchar), 
+           main="Distribution of TZ identifier length", col="darkgrey")
R>

这使用了我在 RcppBDT 包的 SVN repo on R-Forge 中的代码,但还没有在包的 CRAN version 中。

【讨论】:

  • 惊人的答案!实际上,我不能使用可变长度字符串,因为我想将这些字符串存储在数据库中。起初,我不想使用任意长度的 char 字段,但我认为我设置在 40 字符长的字符串 [1] 上。我会将它们放在一个单独的表中,并使用外键引用它们。 1:有一个时区(“America/Argentina/ComodRivadavia”)实际上是 32 个字符长。将来可能会有其他同样长的名字。
  • varchars 实际上不需要指定长度吗?
  • stackoverflow.com/questions/59667/…——正如我在开头所说的那样,你想要varchar :)
  • 我在本地 zoneinfo 目录中可以找到的最长名称是 right/America/Argentina/ComodRivadavia(38 个字符)。除了所有right/... 之外,还有posix/... 名称。这些名称解释为here
  • 仅仅是 VARCHAR 甚至是有效的 SQL 吗?我认为尺寸是强制性的。如果不是,那可能是特定于数据库的,在这种情况下,这是指定数字的好理由 - 如果您为正在使用的数据库指定的值太高,您现在就会发现,而不是当有人尝试时插入它。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多