W magazynie VARCHAR(255)
jest wystarczająco sprytny, aby przechowywać tylko potrzebną długość w danym wierszu, w przeciwieństwie do tego, CHAR(255)
który zawsze przechowuje 255 znaków.
Ale ponieważ oznaczyłeś to pytanie za pomocą MySQL, wspomnę o wskazówce specyficznej dla MySQL: gdy wiersze są kopiowane z warstwy silnika pamięci do warstwy SQL, VARCHAR
pola są konwertowane, CHAR
aby uzyskać przewagę pracy z wierszami o stałej szerokości. Zatem ciągi w pamięci są dopełniane do maksymalnej długości zadeklarowanej VARCHAR
kolumny.
Gdy zapytanie niejawnie generuje tabelę tymczasową, na przykład podczas sortowania lub GROUP BY
, może to zająć dużo pamięci. Jeśli używasz wielu VARCHAR(255)
pól na dane, 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łnienia" oznacza, że ciąg zadeklarowany za pomocą zestawu znaków utf8 wypełnia do trzech bajtów na znak, nawet dla łańcuchów, które przechowujesz z zawartością jednobajtową (np. Znaki ascii lub latin1). Podobnie zestaw znaków utf8mb4 powoduje, że ciąg w pamięci jest wypełniony do czterech bajtów na znak.
Tak 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 małymi znakami plus jeden bajt na długość), ale zajmuje 765 bajtów w pamięci, a więc w tabelach tymczasowych lub posortowanych wynikach.
Pomogłem użytkownikom MySQL, którzy często nieświadomie tworzyli tabele tymczasowe o pojemności 1,5 GB i zapełniali przestrzeń dyskową. Mieli wiele VARCHAR(255)
kolumn, które w praktyce przechowywały bardzo krótkie ciągi.
Najlepiej zdefiniować kolumnę na podstawie typu danych, które zamierzasz przechowywać. Ma zalety wymuszania ograniczeń związanych z aplikacjami, jak wspominali inni ludzie. Ale ma fizyczne zalety, aby uniknąć marnowania pamięci, które opisałem powyżej.
Trudno oczywiście wiedzieć, jaki jest najdłuższy adres pocztowy, dlatego wiele osób wybiera długi VARCHAR
, z pewnością dłuższy niż jakikolwiek adres. A 255 jest zwyczajowe, ponieważ jest to maksymalna długość a, VARCHAR
dla której długość można zakodować jednym bajtem. Była to również maksymalna VARCHAR
długość w MySQL starsza niż 5.0.