MySQL: ENUM() vs. INT() vs.?

haj’mo majeskjuelasi!
do sada za kolone kojima regulisem da li je neko aktivan ili ne, da li postoji kupon ili ne, da li je lista kompanija samo za clanove ili ne, itd. koristim IN(1) NOT NULL DEFAULT n (n je 0 ili 1, zavisi od slucaja). Ali u svakom slucaju koristim 1 ili 0. Naravno, u kolonu se moze upisati bilo koji jednocifreni intedzer ali ja filtriram samo u 1 ili 0.

U jednom slucaju bi mi puno vise odgovaralo da koristim ENUM(‘0’,‘1’) ali u ovom slucaju su 1 i 0 string a ne intedzer.

E, prema nekoj “teoriji” prerazivanje po int je brze nego po stringu. Interesuje me koliko je ovo tacno i da li je primjetna razlika u praksi. Jer ako je u praksi isto (recimo slucajevi do 100K i do 500K rekorda) onda bi mi vise odgovaralo da koristim ENUM().

Da, to je tacno jer string ce biti ASCII (ili veselije UTF-8) znaci da ta “0” je zapravo integer (48) a “1” je (49). Samim tim zauzimace vise prostora. Konkretno za tvoj slucaj ako je ta kolona VARCHAR(1) onda neces osjetit neku razliku do 500k jer prakticno poredi samo brojeve.

Cisto me zanima, zasto bi ti vise pasalo ENUM?

ne znam na koju VARCHAR() kolonu mislis? ja trenutno koristim INT() a htio sam da je poredim sa ENUM().

Na desetak tabela, kada uredjujem podatke koristim

SELECT col1,col2,col3,... FROM table WHERE uslov

i onda kreiram formular u kojem koristim col1, col2, col3,…
Kada iz neke potrebe dodam novu kolonu, npr. colX onda moram da mijenjam QUERY kao i kod tabele. E, ako bih prvo pokupio sve kolone u tabeli pa onda od njih napravio formular, i tom slucaju ne treba da modifikujem kod. Ako koristim INT(1) sa 1 ili 0 vrijednostima onda mora da prvjerim tip kolone i ako je INT(1) onda “pretpostavim” da je to filter i koristim radio/checkbox/drop-down menu. A ako koristim ENUM(‘0’,‘1’) onda ZNAM da je to filter.

Ne znam koliko sam bio jasan :frowning:

Ja koliko znam na malom broju rekorda nema osjetne razlike. Ali kako adioe3 kaze ako stavis varchar(1) da je tip polja onda nece biti razlike. Druga stvar, ako koristis mysqli kako sam cuo (nisam radio), moze koristiti kesiranje pa ce time sve biti znatno brze koji god tip da uzmes. Za to sam samo cuo, mozda neko zna vise.

http://www.mysqlperformanceblog.com/2008/01/24/enum-fields-vs-varchar-vs-int-joined-table-what-is-faster/

[quote=boby]Ja koliko znam na malom broju rekorda nema osjetne razlike. Ali kako adioe3 kaze ako stavis varchar(1) da je tip polja onda nece biti razlike. Druga stvar, ako koristis mysqli kako sam cuo (nisam radio), moze koristiti kesiranje pa ce time sve biti znatno brze koji god tip da uzmes. Za to sam samo cuo, mozda neko zna vise.

http://www.mysqlperformanceblog.com/2008/01/24/enum-fields-vs-varchar-vs-int-joined-table-what-is-faster/[/quote]

izgleda da nisam bio bas najjasniji. ja sada koristim npr. kolonu Active INT(1) je jer to najbrze. medjutim, vrijednost nije limitrana samo na 1 i 0 nego na bilo koji jednocifreni intedzer, jel’ tako? A ako koristim ENUM(‘0’,‘1’) onda vrijednost u koloni Active moze biti SAMO 1 ili 0.
Koristenjem VARCHAR(1) umjesto INT(1) ne dobijam nista. Sta vise…

@afan: Ideja da strukturu formulara napravis prema vrstama kolona u bazi nije losa (i ja sam pokusavao tako nesto davno) ali formulari se brzo zakomplikuju te ovo ne bude dovoljno. Bolja ideja ti je da zavedes neku konvenciju, recimo sa prefiksima naziva kolona:

r_col1 INT(1) -- radio
c_col2 INT(1) -- checkbox
s_col3 INT(1) -- select/dropdown

Preporucio bih ti da ostavis INT(1) jer je sigurno najbrzi. Ako je u pitanju php, samo ti je prakticno nula vazna, evo ti dva primjera zasto:

$var = 0; // nula iz kolone, recimo c_col2
if($var){ echo "Ovo NECE ispisat jer je u PHPu broj 0 i string '0' interpretiran kao false"; }

$var = 1; // ili 2 ili 3 ili 4 ... ili 9
if($var){ echo "Ovo HOCE ispisat jer sve sto nije false je true :-)"; }

Mali edit: VARCHAR komentar se zapravo odnosio na to da je poredjenje stringa sporije i/ili zauzima vise memorije.

Mozda jos jedan prijedlog, ako koristis jednocifrene onda bi bilo mozda bolje TINYINT(1) koji je od 0 - 255, znaci bajtni podatak, sto je ekvivalentno varchar(1) po zauzecu memorije.

Upravo geldam TINYINT() i BIT(). Cini mi se da bi TINYINT() bio najbolje rjesenje.

@afan na onom linku koji je boby postavio došli su do zaključka da su razlike neznatne i da je totalno svejedno šta koristiš, a to je i nekom logikom sasvim očekivan rezultat.
Razlika koju su imali u testu 2 je posljedica korištenja join-a kojeg ti ovdje nemaš.

[quote=vedran]@afan na onom linku koji je boby postavio došli su do zaključka da su razlike neznatne i da je totalno svejedno šta koristiš, a to je i nekom logikom sasvim očekivan rezultat.
Razlika koju su imali u testu 2 je posljedica korištenja join-a kojeg ti ovdje nemaš.[/quote]

Na to sam i htjeo ukazati, ali se izgleda nikom ne da gledati link. :slight_smile:

Ma, procitao sam clanak i objasnio mi je sve. Ja sam iz njega skont’o da je za moje potrebe najbolja solucija TINYINT(). Pogotovo komentar

Definitivno sam odustao svoje prve namjere jer u sustini ne dobijam nista. :slight_smile:

Hvala puno na pomoci.

:wink:

e da ne otvaram novu temu, da vas pitam nesto… Imam instaliran XAMPP na windowsu, kad pokusam preko phpMyAdmin-a da kreiram tabelu, bilo kakvu, ili otvorim vec neku postojecu, javlja mi sljedecu gresku:

SELECT MAX( version ) FROM.WHERE db_name = 'widget_corp’
AND table_name = 'jebiga2’
AND FIND_IN_SET( ‘CREATE TABLE’, tracking ) >0

MySQL said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘WHERE db_name = ‘widget_corp’ AND table_name = ‘jebiga2’ AND FIND_IN_SET(’’ at line 1

malo se ti KVERIJI mijenjaju u zavisnosti od tabele,
hvala :smiley:

FROM.WHERE ?

SELECT nesto FROM nesto
WHERE nesto=nesto …

What he said.

:smiley: nesto mrljavi, nekakve komande, ni sam ne znam :smiley:

Postoje dva tipa kompjuterasa:

  1. Usao u sve opcije
  2. Zna sve sifre

Pa napisao ti je Bo, SELECT.WHERE tu ti je greska

proradilo je samo, nema veze, hvala, pozdrav

Možda si imao bazu ili tabelu koja u imenu sadrži ilegalne karaktere.