Hướng dẫn metadata mysql - siêu dữ liệu mysql

Bao gồm cả MySQL NDB Cụm 8.0

trừu tượng

Đây là hướng dẫn tham khảo MySQL. Nó ghi lại MySQL 8.0 đến 8.0.32, cũng như các bản phát hành cụm NDB dựa trên phiên bản 8.0 của NDB đến 8.0.32-NDB-8.0.32, tương ứng. Nó có thể bao gồm tài liệu về các tính năng của các phiên bản MySQL chưa được phát hành. Để biết thông tin về phiên bản nào đã được phát hành, hãy xem Ghi chú phát hành MySQL 8.0.

Các tính năng MySQL 8.0. & NBSP; Hướng dẫn này mô tả các tính năng không được bao gồm trong mỗi phiên bản của MySQL 8.0; Các tính năng như vậy có thể không được bao gồm trong phiên bản của MySQL 8.0 được cấp phép cho bạn. Nếu bạn có bất kỳ câu hỏi nào về các tính năng được bao gồm trong phiên bản MySQL 8.0 của bạn, hãy tham khảo Thỏa thuận cấp phép MySQL 8.0 của bạn hoặc liên hệ với Đại diện Bán hàng Oracle của bạn. This manual describes features that are not included in every edition of MySQL 8.0; such features may not be included in the edition of MySQL 8.0 licensed to you. If you have any questions about the features included in your edition of MySQL 8.0, refer to your MySQL 8.0 license agreement or contact your Oracle sales representative.

Để ghi chú chi tiết các thay đổi trong mỗi bản phát hành, hãy xem Ghi chú phát hành MySQL 8.0.

Để biết thông tin pháp lý, bao gồm thông tin cấp phép, hãy xem lời nói đầu và thông báo pháp lý.

Để được giúp đỡ trong việc sử dụng MySQL, vui lòng truy cập diễn đàn MySQL, nơi bạn có thể thảo luận về các vấn đề của mình với người dùng MySQL khác.

Tài liệu được tạo vào ngày: 2022-11-12 (Sửa đổi: 74509)


10.2.2 & nbsp; UTF-8 cho siêu dữ liệu

Siêu dữ liệu là dữ liệu về dữ liệu. Bất cứ điều gì mô tả cơ sở dữ liệu, trái ngược với nội dung của cơ sở dữ liệu là siêu dữ liệu. Do đó, tên cột, tên cơ sở dữ liệu, tên người dùng, tên phiên bản và hầu hết các kết quả chuỗi từ SHOW là siêu dữ liệu. Điều này cũng đúng với nội dung của các bảng trong INFORMATION_SCHEMA vì các bảng đó theo định nghĩa chứa thông tin về các đối tượng cơ sở dữ liệu. is the data about the data. Anything that describes the database—as opposed to being the contents of the database—is metadata. Thus column names, database names, user names, version names, and most of the string results from SHOW are metadata. This is also true of the contents of tables in INFORMATION_SCHEMA because those tables by definition contain information about database objects.

Đại diện của siêu dữ liệu phải đáp ứng các yêu cầu này:

  • Tất cả siêu dữ liệu phải nằm trong cùng một bộ ký tự. Mặt khác, cả các câu lệnh SHOWSELECT cho các bảng trong INFORMATION_SCHEMA sẽ hoạt động đúng vì các hàng khác nhau trong cùng một cột kết quả của các hoạt động này sẽ nằm trong các bộ ký tự khác nhau.

  • Siêu dữ liệu phải bao gồm tất cả các ký tự trong tất cả các ngôn ngữ. Nếu không, người dùng sẽ không thể đặt tên cho các cột và bảng bằng ngôn ngữ của riêng họ.

Để đáp ứng cả hai yêu cầu, MySQL lưu trữ siêu dữ liệu trong bộ ký tự Unicode, cụ thể là UTF-8. Điều này không gây ra bất kỳ sự gián đoạn nào nếu bạn không bao giờ sử dụng các ký tự có dấu hoặc không latin. Nhưng nếu bạn làm như vậy, bạn nên lưu ý rằng siêu dữ liệu ở UTF-8.

Các yêu cầu siêu dữ liệu có nghĩa là các giá trị trả về của USER(),

SELECT * FROM t1 WHERE USER() = latin1_column;
0,
SELECT * FROM t1 WHERE USER() = latin1_column;
1,
SELECT * FROM t1 WHERE USER() = latin1_column;
2,
SELECT * FROM t1 WHERE USER() = latin1_column;
3 và
SELECT * FROM t1 WHERE USER() = latin1_column;
4 có ký tự UTF-8 được đặt theo mặc định.

Máy chủ đặt biến hệ thống

SELECT * FROM t1 WHERE USER() = latin1_column;
5 thành tên của bộ ký tự siêu dữ liệu:

mysql> SHOW VARIABLES LIKE 'character_set_system';
+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_system | utf8mb3 |
+----------------------+---------+

Lưu trữ siêu dữ liệu bằng Unicode không có nghĩa là máy chủ trả về các tiêu đề của các cột và kết quả của các hàm

SELECT * FROM t1 WHERE USER() = latin1_column;
6 trong ký tự
SELECT * FROM t1 WHERE USER() = latin1_column;
5 được đặt theo mặc định. Khi bạn sử dụng
SELECT * FROM t1 WHERE USER() = latin1_column;
8, tên
SELECT * FROM t1 WHERE USER() = latin1_column;
9 được trả lại từ máy chủ cho máy khách trong tập ký tự được xác định bởi giá trị của biến hệ thống
INSERT INTO t1 (latin1_column) SELECT USER();
0, có giá trị mặc định là
INSERT INTO t1 (latin1_column) SELECT USER();
1. Nếu bạn muốn máy chủ vượt qua kết quả siêu dữ liệu trong một bộ ký tự khác, hãy sử dụng câu lệnh
INSERT INTO t1 (latin1_column) SELECT USER();
2 để buộc máy chủ thực hiện chuyển đổi bộ ký tự.
INSERT INTO t1 (latin1_column) SELECT USER();
2 đặt
INSERT INTO t1 (latin1_column) SELECT USER();
0 và các biến hệ thống liên quan khác. . Việc khách hàng thực hiện chuyển đổi hiệu quả hơn, nhưng tùy chọn này không phải lúc nào cũng có sẵn cho tất cả các máy khách.not mean that the server returns headers of columns and the results of
SELECT * FROM t1 WHERE USER() = latin1_column;
6 functions in the
SELECT * FROM t1 WHERE USER() = latin1_column;
5 character set by default. When you use
SELECT * FROM t1 WHERE USER() = latin1_column;
8, the name
SELECT * FROM t1 WHERE USER() = latin1_column;
9 itself is returned from the server to the client in the character set determined by the value of the
INSERT INTO t1 (latin1_column) SELECT USER();
0 system variable, which has a default value of
INSERT INTO t1 (latin1_column) SELECT USER();
1. If you want the server to pass metadata results back in a different character set, use the
INSERT INTO t1 (latin1_column) SELECT USER();
2 statement to force the server to perform character set conversion.
INSERT INTO t1 (latin1_column) SELECT USER();
2 sets the
INSERT INTO t1 (latin1_column) SELECT USER();
0 and other related system variables. (See Section 10.4, “Connection Character Sets and Collations”.) Alternatively, a client program can perform the conversion after receiving the result from the server. It is more efficient for the client to perform the conversion, but this option is not always available for all clients.

Nếu

INSERT INTO t1 (latin1_column) SELECT USER();
0 được đặt thành
INSERT INTO t1 (latin1_column) SELECT USER();
6, không có chuyển đổi nào được thực hiện và máy chủ trả về siêu dữ liệu bằng cách sử dụng bộ ký tự gốc của nó (tập hợp được biểu thị bởi
SELECT * FROM t1 WHERE USER() = latin1_column;
5).

Thông báo lỗi được trả về từ máy chủ sang máy khách được chuyển đổi thành bộ ký tự máy khách tự động, như với siêu dữ liệu.

Nếu bạn đang sử dụng (ví dụ) hàm USER() để so sánh hoặc gán trong một câu lệnh, đừng lo lắng. MySQL thực hiện một số chuyển đổi tự động cho bạn.

SELECT * FROM t1 WHERE USER() = latin1_column;

Điều này hoạt động vì nội dung của

INSERT INTO t1 (latin1_column) SELECT USER();
9 được tự động chuyển đổi thành UTF-8 trước khi so sánh.

INSERT INTO t1 (latin1_column) SELECT USER();

Điều này hoạt động vì nội dung của USER() được tự động chuyển đổi thành NDB1 trước khi gán.

Mặc dù chuyển đổi tự động không nằm trong tiêu chuẩn SQL, nhưng tiêu chuẩn không nói rằng mọi bộ ký tự đều (về mặt ký tự được hỗ trợ), một tập hợp con của Unicode. Bởi vì đó là một nguyên tắc nổi tiếng mà những gì áp dụng cho SuperSet có thể áp dụng cho một tập hợp con, nên chúng tôi tin rằng việc đối chiếu cho Unicode có thể áp dụng để so sánh với các chuỗi không phải là Unicode. Để biết thêm thông tin về sự ép buộc của các chuỗi, hãy xem Phần & NBSP; 10.8.4, Sự ép buộc đối chiếu trong các biểu thức.subset of Unicode. Because it is a well-known principle that what applies to a superset can apply to a subset, we believe that a collation for Unicode can apply for comparisons with non-Unicode strings. For more information about coercion of strings, see Section 10.8.4, “Collation Coercibility in Expressions”.