Varchar u MySQL-u je tip podataka koji se koristi za pohranjivanje teksta čija duljina može biti najviše 65535 znakova . Varchar stupci u tablici su od niz promjenjive duljine koji može sadržavati broj ili znak ili oboje. Ova vrsta podataka može pohraniti samo 255 znakova prije verzije 5.0.3, ali s ovom verzijom i novijim može sadržavati do 65535 znakova. Može se pohraniti u MySQL kao 1-bajt ili 2-bajt prefiks duljine plus stvarna veličina.
Prefiks duljine određuje duljinu bajta vrijednosti niza, a ne maksimalnu veličinu koju smo postavili. Ako vrijednosti ne zahtijevaju više od 255 bajtova, stupac koristi prefiks duljine plus jedan bajt. Ako vrijednosti zahtijevaju više od 255 bajtova, stupac koristi prefiks duljine plus dva bajta.
Maksimalna duljina VARCHAR in MySQL podliježe maksimalnoj veličini reda od 65.535 bajtova, koja se dijeli između svih stupaca osim stupaca TEXT/BLOB i skupa znakova koji se koristi. To znači da ukupni stupac ne smije biti veći od 65535 bajtova.
Shvatimo to uz pomoć primjera.
Napravit ćemo dvije tablice i nazvat ćemo ih Test1 i Test2. Obje tablice sadrže dva stupca pod nazivom T1 i T2. Izvršite sljedeću naredbu za stvaranje tablice ' Test 1 ':
CREATE TABLE Test1 ( T1 VARCHAR(32765) NOT NULL, T2 VARCHAR(32766) NOT NULL ) CHARACTER SET = 'latin1' COLLATE LATIN1_DANISH_CI;
Gornja izjava je uspješno stvorila tablicu jer je duljina stupca T1 = 32765 plus 2 bajta i T2 = 32766 plus 2 bajta jednaka 65535 (32765+2+32766+2). Dakle, duljina stupca zadovoljava maksimalnu veličinu retka varchara, koja iznosi 65535.
Sada ćemo vidjeti što se događa ako veličina stupca premašuje maksimalna veličina varchar 65535. Izvršite naredbu u nastavku gdje imamo povećanje veličine stupca T1 za stvaranje tablice Test2 :
veličine žličice
CREATE TABLE Test2 ( T1 VARCHAR(32770) NOT NULL, T2 VARCHAR(32766) NOT NULL ) CHARACTER SET = 'latin1' COLLATE LATIN1_DANISH_CI;
Nakon izvršenja gornje naredbe, MySQL proizvodi pogrešku. To znači da najveća veličina retka ne može premašiti 65 535 bajtova. U svakom slučaju, ako se poveća, izjava nije uspjela, a MySQL će generirati pogrešku.
U drugom slučaju, pretpostavimo da smo kreirali tablicu pod nazivom Test3 koristeći donju izjavu:
CREATE TABLE Test3 ( Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(5) NOT NULL );
Zatim umetnite vrijednosti u tablicu koristeći donju izjavu:
INSERT INTO Test3(Name) VALUES ('Stephen');
Sada izvršite gornju naredbu. MySQL daje poruku greške: Podaci su predugi za stupac 'Ime' u retku 1 . Izlaz to jasnije objašnjava.
MySQL VARCHAR i razmaci
MySQL ne ispunjava prostor za varchar vrijednosti kada su pohranjene. MySQL je također zadržao razmake na kraju kada je pohranio ili dohvatio vrijednosti varchara. Možemo to razumjeti kroz sljedeći primjer gdje an umetnuti izjavu dodaje vrijednosti u Ime stupac tablice Test3 :
INSERT INTO Test3(Name) VALUES ('John ');
Zatim izvršite naredbu SELECT da dohvatite vrijednosti.
SELECT Id, Name, length(Name) FROM Test3;
Dat će sljedeći izlaz gdje je MySQL uključio razmak na kraju u brojanje duljine jer ne povećava duljinu stupca.
Međutim, kada pokušamo umetnuti vrijednost varchar s razmacima na kraju koji premašuju duljinu stupca, MySQL će skratiti zaostale prostore. Također, MySQL izdaje a upozorenje . Sljedeći primjer to jasnije objašnjava:
INSERT INTO Test3(Name) VALUES ('Peter ');
Gornji iskaz umeće vrijednost čija je duljina šest u stupac imena. Vrijednost je i dalje umetnuta u stupac, ali MySQL skraćuje razmak na kraju prije dodavanja vrijednosti. Možemo provjeriti korištenjem donjeg upita gdje možemo vidjeti da je izjava za umetanje uspješno dodana, ali s upozorenjem koje daje: Podaci su skraćeni za stupac 'name' u retku 1 :
Razlika između tipa podataka Char i Varchar
Slijede oba tipa podataka char i varchar ASCII znak . Gotovo su isti, ali se razlikuju u pohranjivanju i dohvaćanju podataka iz baze podataka. Sljedeća tablica sažima bitne razlike između tipa podataka char i varchar:
CHAR | VARCHAR |
---|---|
Odlikuje se karakterom. | Označava promjenjivi karakter. |
Pohranjuje vrijednosti u fiksnoj duljini koju deklariramo prilikom izrade tablice. | Pohranjuje vrijednosti u nizu promjenjive duljine s prefiksom duljine od jednog ili dva bajta. |
Ovaj tip podataka može biti dopunjen razmakom na kraju kako bi se zadržala navedena duljina. | Ova vrsta podataka ne može se dopuniti nikakvim znakom, uključujući razmak, kada se pohranjuje. |
Ne može sadržavati više od 255 znakova. | Može sadržavati do 65535 znakova. |
Podržava statičku dodjelu memorije. | Podržava dinamičku dodjelu memorije. |