Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Độ dài chỉ mục varchar của MySQL

Chỉnh sửa vào tháng 9 năm 2021:Tôi đã sử dụng MySQL 8.0 được vài năm rồi, vì vậy đây là một số thông tin cập nhật.

Hướng dẫn sử dụng MySQL hiện có một trang rất nhiều thông tin về chuyển đổi giữa utf8mb3 (hiện còn được gọi là utf8 ) và utf8mb4 . utf8mb3 không được dùng nữa và sẽ bị xóa sau cùng; và khi nó bị xóa, bí danh hiện tại của nó, utf8 , sẽ tham chiếu đến utf8mb4 thay vào đó.

Với utf8mb3 không dùng nữa , bạn có thể lưu trữ tối đa 255 ký tự trong một chỉ mục, trong khi với utf8mb4 , lên đến 191, khi sử dụng COMPACT hoặc REDUNDANT định dạng hàng.

Với COMPRESSED hoặc DYNAMIC định dạng hàng, tiền tố khóa chỉ mục có thể lên đến 3072 byte. Với chúng, bạn có thể lập chỉ mục tối đa 1024 ký tự cho utf8mb3 và 768 ký tự cho utf8mb4 .

Dưới đây là câu trả lời trước đây của tôi, giải thích một số logic đằng sau số lượng ký tự bạn có thể lập chỉ mục so với số lượng byte .

Tôi phải sửa đổi câu trả lời của mình do nghiên cứu của tôi. Ban đầu tôi đã đăng bài này (tự trích dẫn):

Tôi tin rằng câu trả lời là bạn không thể biết có bao nhiêu ký tự trong chỉ mục vì bạn không thể biết ký tự của mình sẽ là bao nhiêu byte (trừ khi bạn làm điều gì đó để loại trừ các ký tự nhiều byte).

Và tôi không chắc, nhưng nó có thể vẫn đúng, nhưng không hoàn toàn theo cách tôi nghĩ.

Đây là câu trả lời chính xác:

MySQL giả định 3 byte cho mỗi ký tự utf8. 255 ký tự là kích thước chỉ mục tối đa mà bạn có thể chỉ định cho mỗi cột, vì 256x3 =768, phá vỡ giới hạn 767 byte.

Nếu bạn không chỉ định kích thước chỉ mục, MySQL sẽ chọn kích thước tối đa (tức là 255 mỗi cột). Một ràng buộc DUY NHẤT không thể được đặt trên cột utf8 có chiều dài lớn hơn 255, vì chỉ mục duy nhất phải chứa toàn bộ giá trị ô. Nhưng một chỉ mục thông thường có thể được sử dụng - nó sẽ chỉ lập chỉ mục 255 ký tự đầu tiên (hoặc 767 byte đầu tiên?). Và đó là nơi vẫn còn một số bí ẩn đối với tôi.

MySTERY:Tôi có thể hiểu tại sao MySQL giả định 3 byte cho mỗi ký tự, vì sự an toàn, vì nếu không thì ràng buộc UNIQUE có thể bị phá vỡ. Nhưng các tài liệu dường như gợi ý rằng chỉ mục thực sự có kích thước theo byte chứ không phải ký tự. Vì vậy, giả sử bạn đặt 25 5 chỉ mục char (765 byte) trên varchar (25 6 ) cột. Nếu các ký tự bạn lưu trữ đều là ASCII, ký tự 1 byte, như A-Z, a-z, 0-9, thì bạn có thể điều chỉnh toàn bộ cột vào chỉ mục 767 byte. Và có vẻ như đó là những gì thực sự sẽ xảy ra.

Dưới đây là một số thông tin khác từ câu trả lời ban đầu của tôi về các ký tự, byte, v.v.

Theo wikipedia , Ký tự UTF-8 có thể dài 1,2, 3 hoặc 4 byte, nhưng theo tài liệu mysql này , kích thước ký tự tối đa là 3 byte và vì vậy, bất kỳ chỉ mục chỉ mục cột nào trên 255 ký tự đều có thể đạt đến giới hạn byte đó. Nhưng theo tôi hiểu, nó có thể không. Nếu hầu hết các ký tự của bạn nằm trong dải ASCII, thì kích thước ký tự trung bình của bạn sẽ gần bằng 1 byte. Ví dụ:nếu kích thước ký tự trung bình của bạn là 1,3 byte (chủ yếu là 1 byte, nhưng một số lượng lớn ký tự 2-3 byte), thì bạn có thể chỉ định chỉ mục là 767 / 1,3

Vì vậy, nếu bạn đang lưu trữ chủ yếu các ký tự 1 byte, giới hạn ký tự thực tế của bạn sẽ giống như:767 / 1.3 =590. Nhưng hóa ra đó không phải là cách nó hoạt động. 255 ký tự là giới hạn.

Như đã đề cập trong tài liệu MySQL này ,

Giới hạn tiền tố được đo bằng byte, trong khi độ dài tiền tố trong câu lệnh INCREATE INDEX được hiểu là số ký tự cho các kiểu dữ liệu không nhị phân (CHAR, VARCHAR, TEXT). Hãy tính đến điều này khi chỉ định độ dài tiền tố cho một cột sử dụng tập hợp nhiều ký tự phân tử.

Có vẻ như MySQL đang khuyên mọi người thực hiện phép tính / xác định như tôi vừa làm để xác định kích thước khóa của bạn cho một cột varchar. Nhưng trên thực tế bạn không thể chỉ định một chỉ mục lớn hơn 255 cho các cột utf8.

Cuối cùng, nếu bạn quay lại liên kết thứ hai của tôi một lần nữa, cũng có cái này:

Khi tùy chọn cấu hình innodb_large_prefix được bật, giới hạn độ dài này được tăng lên 3072 byte, đối với các bảng InnoDB sử dụng định dạng hàng DYNAMIC và COMPRESSED.

Vì vậy, có vẻ như bạn có thể nhận được các chỉ mục lớn hơn nhiều nếu bạn muốn, với một chút tinh chỉnh. Chỉ cần đảm bảo các định dạng hàng là ĐỘNG hoặc NÉN. Bạn có thể chỉ định một chỉ mục gồm 1023 hoặc 1024 ký tự trong trường hợp đó.

Nhân tiện, hóa ra bạn có thể lưu trữ các ký tự 4 byte bằng cách sử dụng [bộ ký tự utf8mb4] [4]. Bộ ký tự utf8 dường như chỉ lưu trữ các ký tự ["máy bay 0"] [5].

CHỈNH SỬA:

Tôi vừa cố gắng tạo chỉ mục tổng hợp trên cột varchar (511) với cột tinyint (1) và nhận được thông báo lỗi cho biết kích thước chỉ mục tối đa là 767 byte. Điều này khiến tôi tin rằng MySQL giả định các cột bộ ký tự utf8 sẽ chứa 3 byte cho mỗi ký tự (tối đa) và cho phép bạn sử dụng tối đa 255 ký tự. Nhưng có lẽ đó chỉ là với các chỉ mục tổng hợp. Tôi sẽ cập nhật câu trả lời của mình khi tôi tìm hiểu thêm. Nhưng hiện tại, tôi đang để nó dưới dạng một bản chỉnh sửa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phân tích cú pháp ngày trong MySQL

  2. Số tham số không hợp lệ:tham số không được xác định Chèn dữ liệu

  3. MySQL Group_Concat () so với T-SQL String_Agg ()

  4. Cách cài đặt Adminer trên ứng dụng riêng của nó

  5. sử dụng mysql SUM () trong mệnh đề WHERE