2012-09-22 11 views
10

Ich versuche die maximale Länge eines Zeitzonenbezeichners zu finden. Dies ist die Zeichenfolge, die als Name der Zeitzone verwendet wird (z. B. "America/New_York"). Die tz-Datenbank ist nicht hilfreich; Ich konnte keine Implementierungsdetails finden.Maximale Länge des Feldes "tzname"/Zeitzonenbezeichner

Microsoft (.NET Framework 4.5) suggests a max length of 32, aber dies scheint eine Einschränkung ihrer Registrierung zu sein.

libc points to a limit called "_POSIX_TZNAME_MAX", which is 3 characters long, aber dies ist eine absolute Mindestanforderung für POSIX-Konformität. Normalerweise wird eine Implementierung mehr verwenden.

Also die eigentliche Frage ist: Was ist eine akzeptable String-Länge, um Zeitzone "tzname"/Identifier-Name sicher zu speichern?

Antwort

18

Warum nicht einen Container verwenden, der sich nicht interessiert, was die Länge ist - wie z.B. std::string?

Nun, es ist so, dass ich kürzlich mit der TZ db wie im gemeinsamen csv-Format (zB hier in a file from CERN) geliefert gearbeitet habe, aber das gleiche Format wird auch in den Boost-Quellen verwendet.

Mit diesen Daten, ich bin eine maximale Länge von 28 zu sehen:

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> 

Wir können in einem Histogramm schauen auch:

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

enter image description here

Dieser Code verwendet, die ich habe in meinem RcppBDT-Paket SVN repo on R-Forge, aber noch nicht in der CRAN version des Pakets.

+2

Erstaunliche Antwort! Eigentlich kann ich Strings variabler Länge nicht verwenden, weil ich diese Strings in einer Datenbank speichern möchte. Zuerst wollte ich kein willkürlich langes Char-Feld verwenden, aber ich denke, dass ich auf eine 40-Zeichen lange Saite gesetzt bin [1]. Ich werde diese in eine separate Tabelle legen und mit fremden Schlüsseln auf sie verweisen. 1: Es gibt eine Zeitzone ("America/Argentina/ComodRivadavia"), die eigentlich 32 Zeichen lang ist. In der Zukunft könnte es andere gleich lange Namen geben. – sleblanc

+0

Können Sie nicht Varchar in SQL verwenden? –

+2

Benötigen nicht Varchars tatsächlich eine bestimmte Länge? – sleblanc

Verwandte Themen