Jag vill lagra ipnr i samband med inlägg som görs. Alltså behöver jag en kolumn för att lagra dom. Är det Varchar som är bäst? Hur långt är ett ip-nr som längst?
Vad har ipnummer för typ?
Databaser & SQLur Databashanterare & SQL
16 svar · 498 visningar · startad av aasah
32-bitar som längst, så det får precis plats i en kolumn av typen int unsigned.
Vi människor brukar dock oftast utläsa det i bas 256, dvs som fyra tal (med punkter emellan):
a.b.c.d
För att få fram IP-adressen utifrån det multiplicerar man som vid vanlig talbaskonvertering, enligt följande:
d * 256^0
c * 256^1
b * 256^2
a * 256^3
och så adderar man dessa tal.
tydal skrev:
32-bitar som längst, så det får precis plats i en kolumn av typen int unsigned...
Betyder det att om man hämtar ipnr med PHP:s getenv("REMOTE_ADDR") så får man tillbaka ett heltal? :q Eller en människoläslig sträng? :q
Egentligen är det ett heltal, men Php gör om det till en människoläslig sträng (exempelvis 127.0.0.1 istället för 2130706433).
Hur du ska lagra det i databasen beror på vad du har för mål. Vill du att det ska ta så lite plats som möjligt så ska du lagra det som det heltal det egentligen är. Men annars blir det ju bara bökigt eftersom du inte får det serverat som heltal.
Genom att lagra det som int istället för varchar sparar du 12 bytes per lagrad IP-adress.
OK, tack. :) Så länge jag inte får horder med besökare verkar sträng alltså vara att föredra...
Men då borde väl maxlängden bli 15 tecken och inte 32? Eller? högsta talet är väl: 255.255.255.255 ?
32 bitar. Ett tecken består av 8 bitar. En IP-adress tar alltså maximalt upp 4 tecken. Egentligen. Men om du lagrar den i en varchar så blir det ju text istället för ett tal och därmed maximalt 16 tecken (15 tecken för själva innehållet och ett tecken för att tala om hur långt det är).
tydal, försöker du krångla till saker och ting med flit? :)
Jag försöker berätta hur det är. Jag har sett att Åsa håller på en del med programmering så jag antog att hon ville veta hur det funkar.
För ögonblicket vill jag veta vad jag ska ha för maxvärde i min kolumn ipnr VARCHAR(?). Och eftersom den 32 tecken långa strängen md5(.) får plats i CHAR(32) så bör i alla rimligheters namn en 15 tecken lång sträng få plats i VARCHAR(15).
Att tecken och bitar inte är samma sak är förvisso sant, men SQL räknar inte bitar i strängar, den räknar tecken. :)
Tack. :D
En 15 tecken lång sträng i varchar(15) tar dock upp 16 tecken jämfört mot char(15) som tar 15 tecken.
Jo, men fyller man ett varchar(15)-fält med en sträng med fem tecken, så tas sex tecken i anspråk jämfört med 15 i ett char(15)-fält.
tydal skrev:
En 15 tecken lång sträng i varchar(15) tar dock upp 16 tecken jämfört mot char(15) som tar 15 tecken.
Jo, eftersom den måste ha ett avslutande tecken så den vet var den ska sluta läsa. Men det är SQL:s huvudvärk och inte min... ;)
aasah skrev:
Jo, eftersom den måste ha ett avslutande tecken så den vet var den ska sluta läsa.
Du tänker rätt, men SQL är lite special. Har du funderat på varför du inte kan lagra mer än 255 tecken i en varchar? Jag menar, finns det ett strängavslutningstecken borde ju egentligen strängen kunna vara hur lång som helst då den håller på till avslutstecknet kommer.
Det är faktiskt så att SQL använder extra tecknet i varchar:en för att lagra strängens längd. Ett tecken, 8 bitar, kan ju inte lagra större värden än 255, so that's why.