2009-10-20 10 views
16

Jeśli mam kolumny w tabeli z pola typu VARCHAR(15) i jeśli próbuję wstawić dane o długości 16, MySQL daje błąd informującylimit rozmiaru MySQL VARCHAR

Data too long for column 'testname' at row 1 

Czy ktoś wie, dlaczego pól VARCHAR w MySQL wziąć stałą długość? Również ile bajtów zajmuje pole VARCHAR na rekord w oparciu o podany rozmiar?

+4

@Camilo - Fake it 'til you make it! – Ben

Odpowiedz

13

Jeśli ustawisz kolumnę na varchar(15), maksymalna dozwolona liczba bajtów wynosi 15. Tak więc nie możesz przekazać jej więcej niż 15 znaków bez modyfikowania kolumny, aby obsługiwać więcej niż 15. Jeśli przechowujesz czteroznakowy ciąg, powinien on tylko użyj około 4 bajtów z możliwych 15, podczas gdy jeśli użyjesz char(15), wypełnisz pozostałe 11 pustymi bajtami.

http://dev.mysql.com/doc/refman/5.0/en/char.html

(Moja kalkulacja bajt był prawdopodobnie off ponieważ zawsze -1/+ 1 lub coś podobnego).

+0

Dziękuję. Cóż, w moim przypadku nie jestem pewien, jaka będzie długość nadchodzących danych. Może być długa lub może być mała. a dokładniej: Jeśli podałem kolumnę jako Varchar (100), dane mogą mieć 100 znaków lub 50 znaków. Tylko po to, aby moje zrozumienie było jasne. Czy masz na myśli, że będzie to tylko typ danych CHAR. Mam na myśli, że zajmie pełne 100 bajtów dla każdego rekordu lub tylko wstawione 50 bajtów.Również w innych RDBMS Jeśli nie określiłem limitu varchar lub nawet po określeniu limitu, to pozwala mi wstawić więcej znaków niż to. Czy to możliwe w MYSQL. –

+0

Jeśli ustawisz go na 'varchar (100)', a dane twojego wiersza będą miały 50 znaków, to użyje tylko połowy tego, to * nie * będzie działało jako 'char', który wypełnia pozostałe bajty. –

+0

Dzięki, ale nie jest możliwe wstawienie więcej niż 100 bajtów w kolumnie varchar (100). Przepraszamy za powtarzanie tego samego pytania. Ale chcę być bardzo pewny przed ustawieniem dowolnego rozmiaru w kolumnie. Jeszcze raz dziękuję. –

1

Jeśli spojrzeć tutaj powinien powiedzieć ci wszystko o varchar chcesz wiedzieć: http://dev.mysql.com/doc/refman/5.0/en/char.html

Zasadniczo, w zależności od długości wybrałeś będzie używać 1 lub dwa bajty śledzić długość bieżącego smyczkowy w tej kolumnie, więc zapisze liczbę bajtów dla wprowadzonych danych plus jeden lub dwa bajty.

Tak więc, jeśli wstawisz "abc", to będzie to 4 lub 5 bajtów używanych dla tej kolumny w tym wierszu.

Jeśli użyjesz char(15), nawet "abc" zajmie 15 bajtów, ponieważ dane są wstawiane z prawej strony, aby wykorzystać pełne 15 bajtów.

+0

Witaj, James, Co masz na myśli, mówiąc, że dane są poprawne? Również masz na myśli, że nawet jeśli wprowadziłem 10 znaków w kolumnie varchar (15), zajmie to całe 15 bajtów dla 10 znaków, takich jak Char (15). –

+0

Nie, prawy padding jest dla char, a nie varchar. –

13

Z MySQL 5.0 Manual:

Wartości w kolumnach VARCHAR są ciągi o zmiennej długości. Długość może być określona jako wartość od 0 do 255 przed MySQL 5.0.3 i od 0 do 65 535 w wersji 5.0.3 i nowszych. Efektywna maksymalna długość VARCHAR w MySQL 5.0.3 i późniejszych podlega maksymalnemu rozmiarowi wiersza (65 535 bajtów, który jest wspólny dla wszystkich kolumn) i używanemu zestawowi znaków.

I tylko użyć VARCHAR kiedy jestem pewną że dane kolumna musi posiadać nigdy nie przekroczy pewną długość, a nawet wtedy jestem ostrożny. Jeśli przechowuję ciąg tekstowy, używam jednego z typów TEKSTU.

Aby uzyskać więcej informacji na temat użycia bajtów, sprawdź numer MySQL Storage Requirements.

3

Mała dodatkowa uwaga lokalna. Liczba użytych bajtów będzie zależeć od używanego schematu kodowania. 1 bajt na znak w kodowaniu Latin1, ale do 3 w UTF8. Zobacz link w odpowiedzi na pytanie mlambie.

+0

Dzięki. tak. Będę używał UTF-8, więc zajmie podwójny bajt. –