Avatar billede Droa Seniormester
23. maj 2017 - 00:10 Der er 10 kommentarer og
1 løsning

Bruge en varchar 1023 som primary key

Hej Eksperter

Jeg prøver og lave en database der bruger "Username" som Primary key, da det er unikt for hver bruger i en database, men problemet er at en bruger kan iflg den rfc jeg følger have et brugernavn på 1023 karaktere, en MyISAM database, kan kun lave en en varchar på 1000, og når jeg søger på google, kan jeg se at mange kan sætte den til 65k
Så nu sidder jeg og ikke kan komme videre, da det ser ud til jeg er den eneste med det problem.

så jeg ville høre om det kan være korrekt jeg ikke kan lave en varchar på 1023 karaktere?

og hvis det er korrekt man ikke kan det, hvordan kan jeg så best optimere en database til og bruge et brugernavn som primary key?

på forhånd tak
Avatar billede Droa Seniormester
23. maj 2017 - 00:11 #1
jeg køre mysql 5.5.5.5+deb8u1
Avatar billede arne_v Ekspert
23. maj 2017 - 01:32 #2
MySQL 5.5 MyISAM boer kunne gemme VARCHAR op til 65535.

Hvilken fejl faar du naar du forsoeger at oprette tabel med en VARCHAR(1023)?
Avatar billede Droa Seniormester
23. maj 2017 - 01:44 #3
Executing:
ALTER TABLE `XmppServer`.`Users`
ENGINE = MyISAM ,
CHANGE COLUMN `JIDLocal` `JIDLocal` VARCHAR(1023) NOT NULL ;

Operation failed: There was an error while applying the SQL script to the database.
ERROR 1071: Specified key was too long; max key length is 1000 bytes
SQL Statement:
ALTER TABLE `XmppServer`.`Users`
ENGINE = MyISAM ,
CHANGE COLUMN `JIDLocal` `JIDLocal` VARCHAR(1023) NOT NULL
Avatar billede arne_v Ekspert
23. maj 2017 - 01:51 #4
Hmmm.

Den har jo ret.

https://dev.mysql.com/doc/refman/5.5/en/myisam-storage-engine.html


The maximum key length is 1000 bytes.


Problemet er ikke VARCHAR men PRIMARY KEY.
Avatar billede Droa Seniormester
23. maj 2017 - 01:55 #5
helt i orden, så må jeg bare finde en anden løsning, det bliver nok bare noget reference id istedet for, det fylder os mindre plads :)

tak for hjælpen!
Avatar billede arne_v Ekspert
23. maj 2017 - 01:57 #6
Men der er muligvis en workaround.

Kan du proeve om foelgende virker:

CREATE TABLE navn (
...
PRIMARY KEY (ditfelt(1000))
);

saa laver den kun index paa de foerste 1000 tegn.
Avatar billede Droa Seniormester
23. maj 2017 - 02:22 #7
Error Code: 1089. Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys


det ser ud til at key skal være samme længde som selve stringen, hvis jeg forstår den besked korrekt, ellers et ret godt bud, men jeg laver nok bare en tabel med en

ID Base64(Sha1(JIDLocal)) Primary key
JIDLocal varchar(1023) unique


også kan jeg bruge ID som min reference til brugernavn, det burde virke, også er et Sha1Hash vist os kun 160 byte, så det kræver lidt mindre plads at holde som en key. Men jeg ved så ikke hvad last til gir EF 6.0
Avatar billede Droa Seniormester
23. maj 2017 - 02:25 #8
arhh.. jeg kan ikke bruge unique, det var grunden til den stadig skabte sig, fik det os fixet med følgene

alter table XmppServer.Users ADD primary key(JIDLocal(1000)), Add unique key(JIDLocal(1000))
Avatar billede arne_v Ekspert
23. maj 2017 - 02:43 #9
Hvorfor har du et unikt index paa primary key??
Avatar billede Droa Seniormester
23. maj 2017 - 03:07 #10
ren vane, men Primary Key invoker vel unique, så den er vel ret redundant
Avatar billede arne_v Ekspert
23. maj 2017 - 03:29 #11
Netop.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester