|
| Datatyper i mySQL? Fra : Jakob Munck |
Dato : 12-11-05 11:05 |
|
jeg er ved at lave en medlems-site i php/mySQL, men jeg er i tvivl om hvilke
dataformater jeg skal bruge i mySql. Fortæl mig venligst om det er de
rigtige jeg har valgt eller hvilke jeg burde have valgt:
1. Til id-nummeret (tal fra 0 - 100000) har jeg valgt "tinyint(4)"
2. Til fornavn (bogstaver, max 25) har jeg valgt "varchar(50)"
3. Til password (tal og bogstaver med max. 15 karakterer) har jeg valgt
"smallint(5)"
Jeg er især usikker på id-nummeret og på password. Og så vil jeg godt vide,
om man frit kan definere en datatype af formen "varchar" med et vilkårligt
antal karakterer? Kan man f.eks. have en datatype "varchar(27)"?
v.h.
Jakob
| |
Michael Zedeler (12-11-2005)
| Kommentar Fra : Michael Zedeler |
Dato : 12-11-05 14:26 |
|
Jakob Munck wrote:
> jeg er ved at lave en medlems-site i php/mySQL, men jeg er i tvivl om hvilke
> dataformater jeg skal bruge i mySql. Fortæl mig venligst om det er de
> rigtige jeg har valgt eller hvilke jeg burde have valgt:
>
> 1. Til id-nummeret (tal fra 0 - 100000) har jeg valgt "tinyint(4)"
Så vidt jeg kan se, kan du ikke vælge en størrelse. tinyint er pr.
definition en signeret byte. Det går altså grueligt galt. Brug int.
> 2. Til fornavn (bogstaver, max 25) har jeg valgt "varchar(50)"
Hvis du mener at der skal være max 25 tegn, så sæt det da til 25.
> 3. Til password (tal og bogstaver med max. 15 karakterer) har jeg valgt
> "smallint(5)"
Du kan heller ikke sætte længde på en smallint. Det er pr. definition et
signeret heltal på to bytes, altså imellem -32768 og 32767. Det er alt
for småt. Desuden går jeg ud fra at du er ude på at hælde password
igennem en hash-algoritme. Ellers kan du jo ikke lade folks passwords
bestå af andet end tal.
Hvis du f. eks. bruger SHA1, skal du bruge 20 bytes.
> Jeg er især usikker på id-nummeret og på password. Og så vil jeg godt vide,
> om man frit kan definere en datatype af formen "varchar" med et vilkårligt
> antal karakterer? Kan man f.eks. have en datatype "varchar(27)"?
Ja.
Mvh. Michael.
--
Ingen er en alle kender, som ingen har mødt.
Ergo har ingen mødt sig selv.
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
Jakob Munck (12-11-2005)
| Kommentar Fra : Jakob Munck |
Dato : 12-11-05 15:31 |
|
>
>> 3. Til password (tal og bogstaver med max. 15 karakterer) har jeg valgt
>> "smallint(5)"
>
> Du kan heller ikke sætte længde på en smallint. Det er pr. definition et
> signeret heltal på to bytes, altså imellem -32768 og 32767. Det er alt for
> småt. Desuden går jeg ud fra at du er ude på at hælde password igennem en
> hash-algoritme. Ellers kan du jo ikke lade folks passwords bestå af andet
> end tal.
>
Nej, jeg vil ikke kryptere passwords. De skal bare lægges i databasen som de
tal og bogstaver de nu er og max 15 karakterer. Så jeg vælger i stedet
formatet "tinytext".
Er det ikke det bedste valg?
v.h.
Jakob
| |
Michael Zedeler (12-11-2005)
| Kommentar Fra : Michael Zedeler |
Dato : 12-11-05 16:31 |
|
Jakob Munck wrote:
>>>3. Til password (tal og bogstaver med max. 15 karakterer) har jeg valgt
>>>"smallint(5)"
>>
>>Du kan heller ikke sætte længde på en smallint. Det er pr. definition et
>>signeret heltal på to bytes, altså imellem -32768 og 32767. Det er alt for
>>småt. Desuden går jeg ud fra at du er ude på at hælde password igennem en
>>hash-algoritme. Ellers kan du jo ikke lade folks passwords bestå af andet
>>end tal.
>>
>
>
> Nej, jeg vil ikke kryptere passwords. De skal bare lægges i databasen som de
> tal og bogstaver de nu er og max 15 karakterer. Så jeg vælger i stedet
> formatet "tinytext".
>
> Er det ikke det bedste valg?
Nej. Brug varchar og vælg en passende længde.
Mvh. Michael.
--
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
Jakob Munck (12-11-2005)
| Kommentar Fra : Jakob Munck |
Dato : 12-11-05 16:53 |
|
Tak for de gode råd.
v.h.
Jakob
| |
Jakob Munck (12-11-2005)
| Kommentar Fra : Jakob Munck |
Dato : 12-11-05 17:00 |
|
lige et spørgsmål til: Jeg har også en kolonne med deltagernes "status". Det
er et tal mellem 0 og 10. Jeg har valgt at formattere det som "tinyint". Er
det ikke det rigtige?
v.h.
Jakob
| |
Peter Brodersen (13-11-2005)
| Kommentar Fra : Peter Brodersen |
Dato : 13-11-05 15:26 |
|
On Sat, 12 Nov 2005 16:31:29 +0100, Michael Zedeler
<michael@zedeler.dk> wrote:
>> Nej, jeg vil ikke kryptere passwords. De skal bare lægges i databasen som de
>> tal og bogstaver de nu er og max 15 karakterer. Så jeg vælger i stedet
>> formatet "tinytext".
>>
>> Er det ikke det bedste valg?
>
>Nej. Brug varchar og vælg en passende længde.
En klassisk "fejl" her er at glemme at lade et password-felt være
binary (hvilket siden vist MySQL 4.1 blot er en collation). Ellers vil
der ikke være forskel på store og små bogstaver, hvilket kan gøre
pointen med at bede folk om både at bruge store og små bogstaver
ligegyldig.
--
- Peter Brodersen
| |
Jakob Munck (13-11-2005)
| Kommentar Fra : Jakob Munck |
Dato : 13-11-05 15:46 |
|
>>Nej. Brug varchar og vælg en passende længde.
>
> En klassisk "fejl" her er at glemme at lade et password-felt være
> binary (hvilket siden vist MySQL 4.1 blot er en collation). Ellers vil
> der ikke være forskel på store og små bogstaver, hvilket kan gøre
> pointen med at bede folk om både at bruge store og små bogstaver
> ligegyldig.
>
Jeg forstår dig sådan at du mener at man ikke skal vælge varchar, men binary
i stedet for derved at sikre at passwordet er casesensitivt. Rigtig
forstået?
Og hvorfor er det så bedre at lave det casesensitivt? Er det for at gøre det
sværere for uvedkommende at "gætte" sig frem til det rigtige password, eller
hvad?
v.h.
Jakob
| |
Peter Brodersen (13-11-2005)
| Kommentar Fra : Peter Brodersen |
Dato : 13-11-05 16:09 |
|
On Sun, 13 Nov 2005 15:45:45 +0100, "Jakob Munck"
<jm2_fjern_dette@webspeed.dk> wrote:
>Jeg forstår dig sådan at du mener at man ikke skal vælge varchar, men binary
>i stedet for derved at sikre at passwordet er casesensitivt. Rigtig
>forstået?
varchar er en felttype, hvorimod binary er en egenskab (eller en
collation/intern tegnsæts-regel). Så feltet kan stadigvæk være fx
varchar.
De tekniske detaljer:
VARCHAR(15) BINARY
er det samme som
VARCHAR(15) CHARACTER SET latin1 COLLATE latin1_bin
Det er dog ikke det samme som den nyintroducerede felttype
VARBINARY(15) - men det er en anden historie.
>Og hvorfor er det så bedre at lave det casesensitivt? Er det for at gøre det
>sværere for uvedkommende at "gætte" sig frem til det rigtige password, eller
>hvad?
Præcis. Dog, som altid kan man overveje om det medfører en relevant
højere sikkerhed i forhold til potentiel support-bøvl. Jeg mener dog,
at folk generelt bliver opdraget til at benytte både store og små
bogstaver (og dermed er opmærksomme på at der er foskel mellem store
og små bogstaver).
--
- Peter Brodersen
| |
Jakob Munck (13-11-2005)
| Kommentar Fra : Jakob Munck |
Dato : 13-11-05 16:22 |
|
> De tekniske detaljer:
> VARCHAR(15) BINARY
> er det samme som
> VARCHAR(15) CHARACTER SET latin1 COLLATE latin1_bin
>
Jeg er enig i, at det kan være en fordel at anvende casefølsomt password.
Men i min myPHPAdmin kan man ikke indstille "CHARACTER SET", da en sådan
indstilling ikke findes. Men man kan indstille COLLATE til lating1_bin og
det er måske nok, eller hvad?
v.h.
Jakob
| |
Peter Brodersen (13-11-2005)
| Kommentar Fra : Peter Brodersen |
Dato : 13-11-05 17:09 |
|
On Sun, 13 Nov 2005 16:21:53 +0100, "Jakob Munck"
<jm2_fjern_dette@webspeed.dk> wrote:
>Jeg er enig i, at det kan være en fordel at anvende casefølsomt password.
>Men i min myPHPAdmin kan man ikke indstille "CHARACTER SET", da en sådan
>indstilling ikke findes. Men man kan indstille COLLATE til lating1_bin og
>det er måske nok, eller hvad?
Jeg gætter på at vi taler om phpMyAdmin (og ikke myPHPAdmin)? I nyere
udgaver kan man vælge Collation (forudsat at mysql-serveren mindst
kører v4.1).
Alternativt må du jo bare manuelt oprette eller rette tabellen.
phpMyAdmins tabel-generator gør ikke noget, du ikke manuelt kan udføre
med SQL-forespørgsler.
--
- Peter Brodersen
| |
Jakob Munck (13-11-2005)
| Kommentar Fra : Jakob Munck |
Dato : 13-11-05 17:23 |
|
>
> Jeg gætter på at vi taler om phpMyAdmin (og ikke myPHPAdmin)? I nyere
> udgaver kan man vælge Collation (forudsat at mysql-serveren mindst
> kører v4.1).
Jeg kører phpMyAdmin 2.6.4-pl1 og MySQL 4.1.14-nt. Her kan man, som du
siger, vælge Collation. Men du skrev tidligere - som jeg forstod dig - at
jeg skulle sætte "CHARACTER SET" til "latin1". Det kan ikke lade sig gøre
på anden vis end at indtille "Collation" til "latin1_bin".
Jeg går altså ud fra, at det er det du mener. Rigtigt forstået?
v.h.
Jakob
| |
Thorkil Olesen (12-11-2005)
| Kommentar Fra : Thorkil Olesen |
Dato : 12-11-05 18:15 |
|
Michael Zedeler <michael@zedeler.dk> wrote:
> Jakob Munck wrote:
> >
> > 1. Til id-nummeret (tal fra 0 - 100000) har jeg valgt "tinyint(4)"
>
> Så vidt jeg kan se, kan du ikke vælge en størrelse. tinyint er pr.
> definition en signeret byte. Det går altså grueligt galt. Brug int.
Tinyint kan godt defineres unsigned, hvis man angiver det. Det gælder
for alle tal-typer. Og der kan godt angives en størrelse, men den bruges
kun til at angive, hvor mange pladser der skal reserveres i udskriften -
dvs. som regel er den ligegyldig.
Jeg er enig i, at det rigtige valg er int eller int unsigned. Tinyint
kan slet ikke bruges til så store tal, som Jakob vil bruge. Hastigheden
er den samme, og den smule harddiskplads, man kan spare, er helt
ligegyldig i de fleste tilfælde.
> > Jeg er især usikker på id-nummeret og på password. Og så vil jeg godt vide,
> > om man frit kan definere en datatype af formen "varchar" med et vilkårligt
> > antal karakterer? Kan man f.eks. have en datatype "varchar(27)"?
>
> Ja.
Dog max 255 tegn. Til større felter bruges text.
--
Thorkil Olesen,
Hanstholm.
| |
Martin Christensen (12-11-2005)
| Kommentar Fra : Martin Christensen |
Dato : 12-11-05 18:39 |
|
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
"Jakob Munck" <jm2_fjern_dette@webspeed.dk> writes:
> lige et spørgsmål til: Jeg har også en kolonne med deltagernes
> "status". Det er et tal mellem 0 og 10. Jeg har valgt at formattere
> det som "tinyint". Er det ikke det rigtige?
Tja... hvis du skal have en kolonne med værdier mellem 0-10, så er det
måske fornuftigt nok, men personligt ville jeg nok ikke lade en status
være et tal. Jeg ville nok bruge en eller anden kode, der giver
mening i sig selv.
Martin
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
Comment: Using Mailcrypt+GnuPG < http://www.gnupg.org>
iEYEARECAAYFAkN2KMEACgkQYu1fMmOQldUz9gCfQoREQzih53/AVt68ogQHu0Nd
504AoMNYmE6rvCKt1/bcSv+4OHjVzHWH
=1SBT
-----END PGP SIGNATURE-----
| |
|
|