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?
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
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