webForumDet fria alternativet

Vad har ipnummer för typ?

Databaser & SQLur Databashanterare & SQL

16 svar · 498 visningar · startad av aasah

aasahMedlem sedan mars 20034 471 inlägg
#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?

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

aasahMedlem 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

@ndersMedlem sedan juni 200032 969 inlägg
#4

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

Mvh

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

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

aasahMedlem 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 ?

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

@ndersMedlem sedan juni 200032 969 inlägg
#9

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

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

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

tydalMedlem sedan juni 20034 013 inlägg
#12

15.

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

aasahMedlem sedan mars 20034 471 inlägg
#13

Tack. :D

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

@ndersMedlem sedan juni 200032 969 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.

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

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

127 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)