Varchar i MySQL er en datatype som brukes til å lagre tekst hvis lengde kan ha maksimalt 65535 tegn . Varchar-kolonnene i tabellen er av streng med variabel lengde som kan inneholde enten numerisk eller tegn eller begge deler. Denne datatypen er i stand til å lagre bare 255 tegn før versjon 5.0.3, men med denne versjonen og nyere kan den inneholde opptil 65535 tegn. Den kan lagres i MySQL som en 1-byte eller 2-byte lengdeprefiks pluss faktisk størrelse.
Lengdeprefikset spesifiserer bytelengden til en strengverdi, ikke den maksimale størrelsen vi har angitt. Hvis verdiene ikke krever mer enn 255 byte, bruker en kolonne lengdeprefiks pluss én byte. Hvis verdier krever mer enn 255 byte, bruker en kolonne lengdeprefiks pluss to byte.
Maksimal lengde på en VARCHAR in MySQL er underlagt den maksimale radstørrelsen på 65 535 byte, som deles mellom alle kolonner unntatt TEXT/BLOB-kolonner og tegnsettet som brukes. Det betyr at den totale kolonnen ikke skal være mer enn 65535 byte.
La oss forstå det ved hjelp av et eksempel.
Vi skal lage to tabeller og kalte den Test1 og Test2. Begge tabellene inneholder to kolonner kalt T1 og T2. Utfør følgende setning for å lage en tabell ' Test1 ':
CREATE TABLE Test1 ( T1 VARCHAR(32765) NOT NULL, T2 VARCHAR(32766) NOT NULL ) CHARACTER SET = 'latin1' COLLATE LATIN1_DANISH_CI;
Utsagnet ovenfor opprettet en tabell fordi kolonnelengden T1 = 32765 pluss 2 byte og T2 = 32766 pluss 2 byte lik 65535 (32765+2+32766+2). Så kolonnelengden tilfredsstiller den maksimale radstørrelsen til varchar, som er 65535.
Nå skal vi se hva som skjer hvis kolonnestørrelsen overskrider den maksimale størrelsen på varchar 65535. Utfør setningen nedenfor der vi øker størrelsen på kolonne T1 for å lage en tabell Test 2 :
CREATE TABLE Test2 ( T1 VARCHAR(32770) NOT NULL, T2 VARCHAR(32766) NOT NULL ) CHARACTER SET = 'latin1' COLLATE LATIN1_DANISH_CI;
Etter å ha utført setningen ovenfor, produserer MySQL feilen. Det betyr at den maksimale radstørrelsen ikke kan overstige 65 535 byte. I alle fall, hvis den øker, mislyktes setningen, og MySQL vil generere en feil.
I et annet tilfelle, anta at vi har laget en tabell med navnet Test 3 ved å bruke utsagnet nedenfor:
CREATE TABLE Test3 ( Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(5) NOT NULL );
Deretter setter du inn verdier i tabellen ved å bruke setningen nedenfor:
INSERT INTO Test3(Name) VALUES ('Stephen');
Utfør nå setningen ovenfor. MySQL gir feilmeldingen: Dataene er for lange for kolonne 'Navn' på rad 1 . Utgangen forklarer det tydeligere.
MySQL VARCHAR og Spaces
MySQL har ikke polstret plass for varchar-verdier når de lagres. MySQL beholdt også de etterfølgende mellomrommene når de lagret eller hentet varchar-verdier. Vi kan forstå det gjennom følgende eksempel hvor en sette inn uttalelse legger til verdier i Navn kolonne i tabellen Test 3 :
INSERT INTO Test3(Name) VALUES ('John ');
Deretter kjører du SELECT-setningen for å hente verdiene.
SELECT Id, Name, length(Name) FROM Test3;
Det vil gi følgende utgang der MySQL inkluderte det etterfølgende rommet i tellingen av lengde fordi det ikke øker kolonnelengden.
Men når vi prøver å sette inn en varchar-verdi med etterfølgende mellomrom som overskred kolonnelengden, vil MySQL avkorte de etterfølgende mellomrommene. MySQL utsteder også en advarsel . Følgende eksempel forklarer det tydeligere:
INSERT INTO Test3(Name) VALUES ('Peter ');
Utsagnet ovenfor setter inn en verdi hvis lengde er seks inn i navnekolonnen. Verdien er fortsatt satt inn i kolonnen, men MySQL avkorter det etterfølgende rommet før verdien legges til. Vi kan bekrefte ved å bruke spørringen nedenfor der vi kan se insert-setningen lagt til, men med en advarsel som gir: Data avkortet for kolonne 'navn' på rad 1 :
Forskjellen mellom Char og Varchar Data Type
Røye- og varchar-datatypene følger begge ASCII-tegn . De er nesten like, men er forskjellige når det gjelder lagring og henting av data fra databasen. Følgende tabell oppsummerer de vesentlige forskjellene mellom røye og varchar datatype:
CHAR | VARCHAR |
---|---|
Det står av karakter. | Det står for variabel karakter. |
Den lagrer verdiene i fast lengde som vi erklærer mens vi lager en tabell. | Den lagrer verdiene i en streng med variabel lengde med en eller to-byte lengde prefiks. |
Denne datatypen kan polstres med etterfølgende plass for å beholde den angitte lengden. | Denne datatypen kan ikke fylles med tegn, inkludert mellomrom, når de er lagret. |
Den kan ikke inneholde mer enn 255 tegn. | Den kan inneholde opptil 65535 tegn. |
Den støtter statisk minnetildeling. | Den støtter dynamisk minnetildeling. |