Trong MySQL, nếu tôi tạo một VARCHAR(32)
trường mới trong bảng UTF-8, điều đó có nghĩa là tôi có thể lưu trữ 32 byte dữ liệu trong trường đó hoặc 32 ký tự (nhiều byte) không?
Trong MySQL, nếu tôi tạo một VARCHAR(32)
trường mới trong bảng UTF-8, điều đó có nghĩa là tôi có thể lưu trữ 32 byte dữ liệu trong trường đó hoặc 32 ký tự (nhiều byte) không?
Câu trả lời:
Câu trả lời này đã xuất hiện ở đầu kết quả tìm kiếm trên google của tôi nhưng không chính xác vì vậy:
Sự nhầm lẫn có thể là do các phiên bản khác nhau của mysql đang được thử nghiệm.
http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html
MySQL diễn giải các đặc tả độ dài trong định nghĩa cột ký tự theo đơn vị ký tự. (Trước MySQL 4.1, độ dài cột được diễn giải theo byte.) Điều này áp dụng cho các loại CHAR, VARCHAR và TEXT.
Điều thú vị là (tôi chưa nghĩ về nó) độ dài tối đa của một cột varchar bị ảnh hưởng bởi utf8 như sau:
Độ dài tối đa hiệu dụng của một VARCHAR trong MySQL 5.0.3 trở lên tùy 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. Ví dụ: các ký tự utf8 có thể yêu cầu tối đa ba byte cho mỗi ký tự, vì vậy cột VARCHAR sử dụng bộ ký tự utf8 có thể được khai báo là tối đa 21.844 ký tự.
utf8mb4
) có thể lưu trữ "💩💩💩💩💩💩💩💩💩💩" (10 đống poo), đó là 10 ký tự nhưng 40 byte.
nó sẽ cho phép bạn lưu trữ 32 ký tự nhiều byte
Để tiết kiệm dung lượng với UTF-8, hãy sử dụng VARCHAR thay vì CHAR. Nếu không, MySQL phải dành riêng ba byte cho mỗi ký tự trong cột utf8 CHAR CHARACTER SET vì đó là độ dài tối đa có thể. Ví dụ: MySQL phải dành 30 byte cho cột CHARACTER SET utf8.
CHAR
và khi tôi sử dụng nó không nhằm mục đích lưu trữ các ký tự nhiều byte, vì vậy tôi an toàn. Thế còn VARCHAR
, bạn có chắc giới hạn được xác định trong các ký tự nhiều byte chứ không phải trên các ký tự một byte?
32 multibyte dữ liệu cho varchar(32)
đối chiếu utf8_unicode_ci
, tôi vừa thử nghiệm với XAMPP.
1234567890123456789012345678901234567890
Được cắt ngắn thành:
12345678901234567890123456789012
Hãy nhớ rằng đây không phải là các ký tự ASCII thông thường.
utf8
, nhưng sau đó bạn bị hỏng hỗ trợ Unicode trong MySQL. Bạn nên sử dụng utf8mb4
mã hóa thay vào đó, vì có tối đa. 4 byte trong một utf8 char , không phải 3 như trong biến thể của utf8 MySQL của ...
Tốt hơn nên sử dụng "char" cho các bảng cập nhật thường xuyên cao vì tổng độ dài dữ liệu của hàng sẽ cố định và nhanh chóng. Các cột Varchar làm cho kích thước dữ liệu hàng động. Điều đó không tốt cho MyISAM, nhưng tôi không biết về InnoDB và những người khác. Ví dụ: nếu bạn có cột "loại" rất hẹp, có thể tốt hơn là sử dụng char (2) với bộ ký tự latin1 để chỉ yêu cầu không gian tối thiểu.
CHAR
. Đối với InnoDB, rất nhiều thứ khác đang diễn ra nên cuộc tranh luận về "kích thước hàng động / cố định" về cơ bản là không liên quan.
CHAR
.
Nếu bạn kết nối với cơ sở dữ liệu bằng cách sử dụng mã hóa latin1 (ví dụ với PHP) để lưu một chuỗi PHP UTF8 trong một cột MySQL UTF8, bạn sẽ có một mã hóa UTF8 kép.
Nếu chuỗi UTF8 dài $s
32 ký tự nhưng dài 64 byte và cột là VARCHAR(32)
UTF8, thì mã hóa kép sẽ chuyển đổi chuỗi thành chuỗi $s
UTF8 dài 64 ký tự sẽ bị cắt ngắn trong cơ sở dữ liệu thành 32 ký tự đầu tiên tương ứng với 32 byte đầu tiên của $s
. Bạn có thể nghĩ rằng MySQL 5 hoạt động giống như MySQL 4 nhưng trên thực tế đó là nguyên nhân thứ hai gây ra hiệu ứng tương tự.