sql >> Databasteknik >  >> RDS >> Mysql

varchar(20) och varchar(50) är samma?

MySQL erbjuder ett urval av lagringsmotorer. Den fysiska lagringen av data beror på lagringsmotorn.

MyISAM-lagring av VARCHAR

I MyISAM, VARCHAR s upptar vanligtvis bara den faktiska längden på strängen plus en byte eller två av längden. Detta görs praktiskt genom designbegränsningen av MyISAM till bordslåsning i motsats till en radlåsningsfunktion. Prestandakonsekvenserna inkluderar en mer kompakt cacheprofil, men också mer komplicerad (långsammare) beräkning av postoffset.

(Faktum är att MyISAM ger dig en grad av valfrihet mellan fast fysisk radstorlek och variabel fysisk radstorlek tabellformat beroende på kolumntyper som förekommer i hela tabellen. Förekomst av VARCHAR ändrar bara standardmetoden, men närvaron av en TEXT blob krafter VARCHAR s i samma tabell för att använda metoden med variabel längd också.)

Den fysiska lagringsmetoden är särskilt viktig med index, vilket är en annan historia än tabeller. MyISAM använder rymdkomprimering för båda CHAR och VARCHAR kolumner, vilket innebär att kortare data tar mindre plats i indexet i båda fallen.

InnoDB-lagring av VARCHAR

InnoDB, som de flesta andra nuvarande relationsdatabaser, använder en mer sofistikerad mekanism. VARCHAR kolumner vars maximala bredd är mindre än 768 byte kommer att lagras inline, med reserverat rum som matchar den maximala bredden. Mer exakt här :

InnoDB gör för närvarande inte rymdkomprimering i sina index, motsatsen till MyISAM som beskrivs ovan.

Tillbaka till frågan

Allt ovanstående är dock bara en implementeringsdetalj som till och med kan ändras mellan versionerna. Den verkliga skillnaden mellan CHAR och VARCHAR är semantisk, och så är den mellan VARCHAR(20) och VARCHAR(50) . Genom att säkerställa att det inte finns något sätt att lagra en sträng på 30 tecken i en VARCHAR(20) , databasen gör livet enklare och bättre definierat för olika processorer och applikationer som den förmodligen integrerar i en förutsägbart fungerande lösning. Det här är den stora affären.

När det gäller personnamn specifikt, den här frågan kan ge dig lite praktisk vägledning. Personer med fullständiga namn över 70 UTF-8-tecken har problem ändå.



  1. hur anpassar man "visa processlista" i mysql?

  2. Hur får jag information om datum/tid från en TIMESTAMP-kolumn?

  3. Ta bort ALLA eller särskilda tecken som inte kan skrivas ut från kolumnen i mysql

  4. Hur man skapar schema i Oracle med SQL Developer?