2012-05-01 44 views
5

Tài liệu MySQL nói rằng kể từ 5.0, độ dài varchar tham chiếu đến các đơn vị ký tự, chứ không phải byte. Tuy nhiên, gần đây tôi đã gặp một vấn đề mà tôi đã nhận được cảnh báo dữ liệu cắt ngắn khi chèn các giá trị cần phải phù hợp với cột varchar nó đã được chỉ định.MySQL UTF8 varchar column size

Tôi lặp lại vấn đề này với một bảng đơn giản trong v5.1

mysql> show create table test\G 
*************************** 1. row *************************** 
Table: test 
Create Table: CREATE TABLE `test` (
    `string` varchar(10) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

tôi sau đó chèn nhiều 10 ký tự giá trị với một lượng ký tự UTF8 khác nhau

mysql> insert into test (string) values 
    -> ('abcdefghij'), 
    -> ('ãáéíçãáéíç'), 
    -> ('ãáéíç67890'), 
    -> ('éíç4567890'), 
    -> ('íç34567890'); 
Query OK, 5 rows affected, 4 warnings (0.06 sec) 
Records: 5 Duplicates: 0 Warnings: 4 

mysql> show warnings; 
+---------+------+---------------------------------------------+ 
| Level | Code | Message          | 
+---------+------+---------------------------------------------+ 
| Warning | 1265 | Data truncated for column 'string' at row 2 | 
| Warning | 1265 | Data truncated for column 'string' at row 3 | 
| Warning | 1265 | Data truncated for column 'string' at row 4 | 
| Warning | 1265 | Data truncated for column 'string' at row 5 | 
+---------+------+---------------------------------------------+ 

mysql> select * from test; 
+------------+ 
| string  | 
+------------+ 
| abcdefghij | 
| ãáéíç | 
| ãáéíç | 
| éíç4567 | 
| íç345678 | 
+------------+ 
5 rows in set (0.00 sec) 

Tôi nghĩ rằng điều này cho thấy rằng kích thước varchar vẫn được xác định bằng byte hoặc ít nhất, không chính xác trong các đơn vị ký tự.

Câu hỏi đặt ra là, tôi có hiểu tài liệu chính xác và đây có phải là lỗi không? Hay tôi hiểu sai tài liệu?

+1

Không phải là nó giúp bạn trong nhỏ nhất nhưng [trên sqlfiddle] (http://sqlfiddle.com/#!2/829b8/2), mà tuyên bố là 5,5,20, một không bị vấn đề này. Có lẽ đó là một lỗi đã được sửa chữa (tôi đã tìm kiếm, nhưng chưa định vị một báo cáo lỗi). – eggyal

+0

Vấn đề tương tự tồn tại trong 5.5.19, do đó có thể là phiên bản đã được sửa. Một kiểm tra của các ghi chú phát hành cho thấy không có đề cập đến varchars hoặc UTF8 – sreimer

Trả lời

7

Đúng là kích thước VARCHAR và CHAR được xem xét theo ký tự chứ không phải byte.

Tôi đã có thể tạo lại sự cố của bạn khi tôi đặt ký tự kết nối được đặt thành latin1 (byte đơn).

Đảm bảo rằng bạn thiết lập nhân vật kết nối của bạn thiết lập để UTF8 trước khi chạy truy vấn chèn với lệnh sau đây:

SET NAMES utf8 

Nếu bạn không làm điều này, một nhân vật UTF8 hai byte sẽ được gửi như hai ký tự một byte.

Bạn có thể xem xét thay đổi default client character set của mình.

+0

Đây thực sự là vấn đề. Tôi đã mong đợi bản ghi kết quả hiển thị không đúng nếu bộ ký tự không chính xác được sử dụng. – sreimer

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