webForumDet fria alternativet

Vad har ipnummer för typ?

Databaser & SQL

16 svar · 499 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Frågan#1

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?

Medlem sedan juni 20034 013 inlägg
#2

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.

Medlem sedan mars 20034 471 inlägg
#3

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

Medlem sedan juni 200032 967 inlägg
#4

Det är en vanlig sträng, så varchar passar bra.

Mvh

Medlem sedan juni 20034 013 inlägg
#5

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.

Medlem sedan juni 20034 013 inlägg
#6

Genom att lagra det som int istället för varchar sparar du 12 bytes per lagrad IP-adress.

Medlem sedan mars 20034 471 inlägg
#7

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 ?

Medlem sedan juni 20034 013 inlägg
#8

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).

Medlem sedan juni 200032 967 inlägg
#9

tydal, försöker du krångla till saker och ting med flit? :)

Medlem sedan juni 20034 013 inlägg
#10

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.

Medlem sedan mars 20034 471 inlägg
#11

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. :)

Medlem sedan juni 20034 013 inlägg
#12

15.

SQL räknar däremot bitar på numeriska kolumntyper.

Medlem sedan mars 20034 471 inlägg
#13

Tack. :D

Medlem sedan juni 20034 013 inlägg
#14

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.

Medlem sedan juni 200032 967 inlägg
#15

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.

Medlem sedan mars 20034 471 inlägg
#16

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... ;)

Medlem sedan juni 20034 013 inlägg
#17

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.

254 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)