W pamięci VARCHAR(255)
jest wystarczająco sprytny, aby przechowywać tylko potrzebną długość w danym wierszu, w przeciwieństwie do CHAR(255)
który zawsze przechowuje 255 znaków.
Ale ponieważ oznaczyłeś to pytanie za pomocą MySQL, wspomnę o wskazówce dotyczącej MySQL:ponieważ wiersze są kopiowane z warstwy silnika pamięci masowej do warstwy SQL, VARCHAR
pola są konwertowane na CHAR
aby uzyskać przewagę pracy z rzędami o stałej szerokości. Tak więc ciągi w pamięci zostają wypełnione do maksymalnej długości z zadeklarowanych VARCHAR
kolumna.
Gdy zapytanie niejawnie generuje tabelę tymczasową, na przykład podczas sortowania lub GROUP BY
, może to zużywać dużo pamięci. Jeśli używasz dużo VARCHAR(255)
pola dla danych, które nie muszą być tak długie, może to spowodować, że tabela tymczasowa będzie bardzo duża.
Możesz również chcieć wiedzieć, że to zachowanie „wypełniania” oznacza, że ciąg zadeklarowany za pomocą zestawu znaków utf8 dopełnia się do trzech bajtów na znak, nawet w przypadku ciągów, które przechowujesz z zawartością jednobajtową (np. znaki ascii lub latin1). Podobnie zestaw znaków utf8mb4 powoduje, że ciąg jest wypełniany do czterech bajtów na znak w pamięci.
Więc VARCHAR(255)
w utf8 przechowywanie krótkiego ciągu, takiego jak „Brak opinii”, zajmuje 11 bajtów na dysku (dziesięć znaków z niższego zestawu znaków, plus jeden bajt długości), ale zajmuje 765 bajtów w pamięci, a więc w tabelach tymczasowych lub posortowanych wynikach.
Pomogłem użytkownikom MySQL, którzy nieświadomie często tworzyli tabele tymczasowe o pojemności 1,5 GB i zapełniali swoje miejsce na dysku. Mieli dużo VARCHAR(255)
kolumny, które w praktyce przechowują bardzo krótkie ciągi.
Najlepiej zdefiniować kolumnę na podstawie typu danych, które zamierzasz przechowywać. Ma korzyści z egzekwowania ograniczeń związanych z aplikacjami, o czym wspominali inni. Ale ma to fizyczne zalety, aby uniknąć marnowania pamięci, które opisałem powyżej.
Oczywiście trudno jest określić, jaki jest najdłuższy adres pocztowy, dlatego wiele osób wybiera długi VARCHAR
to z pewnością jest dłuższe niż jakikolwiek adres. A 255 jest zwyczajowe, ponieważ jest to maksymalna długość VARCHAR
dla których długość może być zakodowana jednym bajtem. Był to również maksymalny VARCHAR
długość w MySQL starszym niż 5.0.