2012-09-22 89 views
10

我正在嘗試查找時區標識符的最大長度。這是用作時區名稱的字符串(例如「America/New_York」)。 tz數據庫沒有幫助;我找不到實現細節。「tzname」字段/時區標識符名稱的最大長度

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」/標識符名稱?

回答

18

爲什麼不使用不關心長度的容器 - 例如, std::string

現在,我正在最近使用通用csv格式提供的TZ db(例如in a file from CERN),但在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> 

enter image description here

這使用,我有代碼在我的RcppBDT包的SVN repo on R-Forge中,但還沒有在包的CRAN version中。

+2

令人驚歎的答案!實際上,我不能使用可變長度的字符串,因爲我想將這些字符串存儲在數據庫中。起初,我不想使用任意長的char字段,但我認爲我設置了一個長度爲40個字符的字符串[1]。我將把它們放在一個單獨的表格中,並使用外鍵引用它們。 1:有一個實際上是32個字符的時區(「America/Argentina/ComodRivadavia」)。將來可能會有其他同樣長的名字。 – sleblanc

+0

你不能在SQL中使用varchar嗎? –

+2

varchars實際上是否需要指定的長度? – sleblanc