2009-10-20 45 views
16

Nếu tôi có một cột trong bảng với lĩnh vực loại VARCHAR(15) và nếu tôi cố gắng để chèn dữ liệu có độ dài 16, MySQL đưa ra một báo lỗigiới hạn kích thước MySQL VARCHAR

Data too long for column 'testname' at row 1 

Có ai biết tại sao VARCHAR trường trong MySQL mất chiều dài cố định? Một trường VARCHAR lấy bao nhiêu byte dựa trên kích thước được đưa ra?

+4

@Camilo - Fake cho đến khi bạn thực hiện! – Ben

Trả lời

13

Nếu bạn đặt cột là varchar(15) thì số byte tối đa cho phép là 15. Vì vậy, bạn không thể vượt quá 15 ký tự mà không sửa đổi cột để hỗ trợ hơn 15. Nếu bạn lưu chuỗi 4 ký tự, chỉ cần sử dụng khoảng 4 byte trong số 15 byte có thể, trong khi nếu bạn đã sử dụng char(15), nó sẽ được điền vào 11 byte còn lại bằng byte trống.

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

(tính byte của tôi có lẽ tắt vì nó luôn -1/+ 1 hoặc một cái gì đó như thế).

+0

Cảm ơn bạn. Trong trường hợp của tôi, tôi thực sự không chắc chắn về độ dài của dữ liệu. Nó có thể dài hoặc có thể nhỏ. chính xác hơn: Nếu tôi đã chỉ định cột là Varchar (100) thì dữ liệu có thể có 100 ký tự hoặc có thể là 50 ký tự. Chỉ để hiểu rõ hơn. Bạn có nghĩa là nó sẽ chỉ hoạt động như kiểu dữ liệu CHAR. Tôi có nghĩa là nó sẽ mất 100 byte đầy đủ cho mỗi bản ghi hoặc chỉ chèn 50 byte.Cũng trong RDBMS khác Nếu tôi havent xác định giới hạn varchar hoặc thậm chí sau khi giới hạn specifyin nó cho phép tôi chèn thêm ký tự hơn đó. Có thể trong MYSQL. –

+0

Nếu bạn đặt nó thành 'varchar (100)' và dữ liệu hàng của bạn là 50 ký tự thì nó sẽ chỉ sử dụng hết một nửa, * không * hoạt động như 'char' lấp đầy các byte còn lại. –

+0

Cảm ơn nhưng không thể chèn hơn 100 byte vào cột varchar (100). Xin lỗi vì đã hỏi lại cùng một câu hỏi. Nhưng tôi muốn rất chắc chắn trước khi thiết lập bất kỳ kích thước cho cột. Cảm ơn bạn lần nữa. –

1

Nếu bạn nhìn ở đây nó sẽ cho bạn biết tất cả mọi thứ về varchar bạn muốn biết: http://dev.mysql.com/doc/refman/5.0/en/char.html

Về cơ bản, tùy thuộc vào độ dài mà bạn đã chọn nó sẽ sử dụng 1 hoặc hai byte để theo dõi độ dài của chuỗi hiện tại cột đó, do đó, nó sẽ lưu trữ số byte cho dữ liệu bạn đưa vào, cộng với một hoặc hai byte.

Vì vậy, nếu bạn đặt trong 'abc' thì nó sẽ là 4 hoặc 5 byte được sử dụng cho cột đó trong hàng đó.

Nếu bạn sử dụng char(15) thì ngay cả 'abc' sẽ chiếm 15 byte, vì dữ liệu là đệm phải để sử dụng hết 15 byte.

+0

Xin chào James, Bạn có ý nghĩa gì khi dữ liệu được đệm đúng? Cũng làm u có nghĩa là ngay cả khi tôi nhập 10 ký tự trong cột varchar (15) này sẽ mất toàn bộ 15 byte cho 10 ký tự như Char (15) sẽ mất. –

+0

Không, phần đệm phải dành cho char, không phải là varchar. –

13

Từ MySQL 5.0 Manual:

giá trị trong các cột VARCHAR là chuỗi chiều dài thay đổi. Độ dài có thể được xác định dưới dạng giá trị từ 0 đến 255 trước MySQL 5.0.3 và 0 đến 65.535 trong 5.0.3 và các phiên bản sau. Độ dài tối đa hiệu dụng của VARCHAR trong MySQL 5.0.3 và sau đó phụ thuộc vào kích thước hàng tối đa (65.535 byte, được chia sẻ giữa tất cả các cột) và bộ ký tự được sử dụng.

tôi chỉ sử dụng VARCHAR khi tôi nhất định rằng các dữ liệu cột cần nắm giữ sẽ không bao giờ vượt quá một độ dài nhất định, và thậm chí sau đó tôi thận trọng. Nếu tôi đang lưu trữ một chuỗi văn bản, tôi có xu hướng sử dụng một trong các loại TEXT.

Khám phá MySQL Storage Requirements để biết thêm thông tin về cách sử dụng byte.

3

Ghi chú địa phương bổ sung nhỏ. Số byte được sử dụng sẽ phụ thuộc vào lược đồ mã hóa đang sử dụng. 1 byte cho mỗi ký tự trong mã hóa latin1, nhưng tối đa 3 trong UTF8. Xem liên kết trong câu trả lời của mlambie để biết chi tiết.

+0

Cảm ơn. có. Tôi sẽ sử dụng UTF-8, SO nó sẽ mất gấp đôi byte. –

Các vấn đề liên quan