Hướng dẫn mysql quoted identifiers - số nhận dạng được trích dẫn mysql

Một số đối tượng trong MySQL, bao gồm cơ sở dữ liệu, bảng, chỉ mục, cột, bí danh, chế độ xem, thủ tục lưu trữ, phân vùng, không gian bảng, nhóm tài nguyên và các tên đối tượng khác được gọi là định danh. Phần này mô tả cú pháp cho phép cho các định danh trong MySQL. Phần & NBSP; 9.2.1, Giới hạn độ dài định danh, chỉ ra độ dài tối đa của từng loại định danh. Phần & NBSP; 9.2.3, Độ nhạy của trường hợp định danh, mô tả loại định danh nào nhạy cảm với trường hợp và trong các điều kiện nào.

Một định danh có thể được trích dẫn hoặc không được trích dẫn. Nếu một mã định danh chứa các ký tự đặc biệt hoặc là một từ dành riêng, bạn phải trích dẫn nó bất cứ khi nào bạn tham khảo nó. .must quote it whenever you refer to it. (Exception: A reserved word that follows a period in a qualified name must be an identifier, so it need not be quoted.) Reserved words are listed at Section 9.3, “Keywords and Reserved Words”.

Trong nội bộ, các định danh được chuyển đổi và được lưu trữ dưới dạng Unicode (UTF-8). Các ký tự unicode cho phép trong các định danh là các ký tự trong mặt phẳng đa ngôn ngữ cơ bản (BMP). Các ký tự bổ sung không được phép. Do đó, số nhận dạng có thể chứa các ký tự sau:

  • Các ký tự được phép trong các định danh chưa được trích dẫn:

    • ASCII: [0-9, A-Z, A-Z $ _] (chữ cái Latin cơ bản, chữ số 0-9, Dollar, Undercore)

    • Mở rộng: U+0080 .. U+FFFF

  • Các ký tự được phép trong các định danh được trích dẫn bao gồm toàn bộ mặt phẳng đa ngôn ngữ cơ bản (BMP), ngoại trừ U+0000:

    • ASCII: U+0001 .. U+007F

    • Mở rộng: U+0080 .. U+FFFF

  • Các ký tự được phép trong các định danh được trích dẫn bao gồm toàn bộ mặt phẳng đa ngôn ngữ cơ bản (BMP), ngoại trừ U+0000:

  • ASCII: U+0001 .. U+007F

  • ASCII NUL (U+0000) và các ký tự bổ sung (U+10000 trở lên) không được phép trong các định danh được trích dẫn hoặc chưa được trích dẫn.

Định danh có thể bắt đầu bằng một chữ số nhưng trừ khi được trích dẫn có thể không chỉ bao gồm các chữ số.

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

Cơ sở dữ liệu, bảng và tên cột không thể kết thúc bằng các ký tự không gian.

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

Ký tự trích dẫn định danh là backtick (`):

Nếu chế độ ANSI_QUOTES SQL được bật, thì cũng được phép trích dẫn các định danh trong dấu ngoặc kép: Dấu hiệu:

mysql> CREATE TABLE `a``b` (`c"d` INT);

Chế độ ANSI_QUOTES khiến máy chủ diễn giải các chuỗi được trích dẫn kép là định danh. Do đó, khi chế độ này được bật, các chuỗi chữ phải được đặt trong các dấu ngoặc kép. Chúng không thể được đặt trong các dấu ngoặc kép. Chế độ SQL máy chủ được điều khiển như được mô tả trong Phần & NBSP; 5.1.11, chế độ SQL Server SQL.

mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+

Các ký tự trích dẫn định danh có thể được bao gồm trong một định danh nếu bạn trích dẫn định danh. Nếu ký tự được bao gồm trong định danh giống như được sử dụng để trích dẫn chính số nhận dạng, thì bạn cần tăng gấp đôi ký tự. Câu lệnh sau đây tạo một bảng có tên

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
1 chứa một cột có tên
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
2:

Trong danh sách chọn truy vấn, bí danh cột được trích dẫn có thể được chỉ định bằng cách sử dụng định danh hoặc chuỗi trích dẫn ký tự:

Ở những nơi khác trong tuyên bố, các tài liệu tham khảo được trích dẫn cho bí danh phải sử dụng trích dẫn định danh hoặc tham chiếu được coi là một chuỗi theo nghĩa đen.

Bạn nên sử dụng các tên bắt đầu bằng

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
3E hoặc
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
3E
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
5, trong đó
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
6 và
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
5 là số nguyên. Ví dụ: tránh sử dụng
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
8 làm định danh, bởi vì một biểu thức như
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
9 không rõ ràng. Tùy thuộc vào ngữ cảnh, nó có thể được hiểu là biểu thức
mysql> CREATE TABLE `a``b` (`c"d` INT);
0 hoặc là số
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
9.

Hãy cẩn thận khi sử dụng

mysql> CREATE TABLE `a``b` (`c"d` INT);
2 để tạo tên bảng vì nó có thể tạo ra tên ở các định dạng bất hợp pháp hoặc mơ hồ như những người vừa được mô tả.

Chúng tôi cũng khuyên bạn không sử dụng tên cột bắt đầu bằng

mysql> CREATE TABLE `a``b` (`c"d` INT);
3 để đảm bảo rằng các tên mới không va chạm với các tên được sử dụng bởi các cột ẩn hiện có cho các chỉ mục chức năng.

Một số đối tượng trong MYSQL, bao gồm cơ sở dữ liệu, bảng, chỉ mục, cột, bí danh, chế độ xem, quy trình lưu trữ, phân vùng, không gian bảng và các tên đối tượng khác được gọi là định danh. Phần này mô tả cú pháp cho phép cho các định danh trong MySQL. Phần & NBSP; 9.2.1, Giới hạn độ dài định danh, chỉ ra độ dài tối đa của từng loại định danh. Phần & NBSP; 9.2.3, Độ nhạy của trường hợp định danh, mô tả loại định danh nào nhạy cảm với trường hợp và trong các điều kiện nào.

Một định danh có thể được trích dẫn hoặc không được trích dẫn. Nếu một mã định danh chứa các ký tự đặc biệt hoặc là một từ dành riêng, bạn phải trích dẫn nó bất cứ khi nào bạn tham khảo nó. .must quote it whenever you refer to it. (Exception: A reserved word that follows a period in a qualified name must be an identifier, so it need not be quoted.) Reserved words are listed at Section 9.3, “Keywords and Reserved Words”.

Trong nội bộ, các định danh được chuyển đổi và được lưu trữ dưới dạng Unicode (UTF-8). Các ký tự unicode cho phép trong các định danh là các ký tự trong mặt phẳng đa ngôn ngữ cơ bản (BMP). Các ký tự bổ sung không được phép. Do đó, số nhận dạng có thể chứa các ký tự sau:

  • Các ký tự được phép trong các định danh chưa được trích dẫn:

    • ASCII: [0-9, A-Z, A-Z $ _] (chữ cái Latin cơ bản, chữ số 0-9, Dollar, Undercore)

    • Mở rộng: U+0080 .. U+FFFF

  • Các ký tự được phép trong các định danh được trích dẫn bao gồm toàn bộ mặt phẳng đa ngôn ngữ cơ bản (BMP), ngoại trừ U+0000:

    • ASCII: U+0001 .. U+007F

    • Mở rộng: U+0080 .. U+FFFF

  • Các ký tự được phép trong các định danh được trích dẫn bao gồm toàn bộ mặt phẳng đa ngôn ngữ cơ bản (BMP), ngoại trừ U+0000:

  • ASCII: U+0001 .. U+007F

  • Cơ sở dữ liệu, bảng và tên cột không thể kết thúc bằng các ký tự không gian.

Ký tự trích dẫn định danh là backtick (`):

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

Nếu chế độ ANSI_QUOTES SQL được bật, thì cũng được phép trích dẫn các định danh trong dấu ngoặc kép: Dấu hiệu:

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

Chế độ ANSI_QUOTES khiến máy chủ diễn giải các chuỗi được trích dẫn kép là định danh. Do đó, khi chế độ này được bật, các chuỗi chữ phải được đặt trong các dấu ngoặc kép. Chúng không thể được đặt trong các dấu ngoặc kép. Chế độ SQL máy chủ được điều khiển như được mô tả trong Phần & NBSP; 5.1.10, chế độ SQL Server SQL.

Các ký tự trích dẫn định danh có thể được bao gồm trong một định danh nếu bạn trích dẫn định danh. Nếu ký tự được bao gồm trong định danh giống như được sử dụng để trích dẫn chính số nhận dạng, thì bạn cần tăng gấp đôi ký tự. Câu lệnh sau đây tạo một bảng có tên

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
1 chứa một cột có tên
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
2:

mysql> CREATE TABLE `a``b` (`c"d` INT);

Trong danh sách chọn truy vấn, bí danh cột được trích dẫn có thể được chỉ định bằng cách sử dụng định danh hoặc chuỗi trích dẫn ký tự:

mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+

Ở những nơi khác trong tuyên bố, các tài liệu tham khảo được trích dẫn cho bí danh phải sử dụng trích dẫn định danh hoặc tham chiếu được coi là một chuỗi theo nghĩa đen.

Bạn nên sử dụng các tên bắt đầu bằng

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
3E hoặc
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
3E
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
5, trong đó
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
6 và
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
5 là số nguyên. Ví dụ: tránh sử dụng
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
8 làm định danh, bởi vì một biểu thức như
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
9 không rõ ràng. Tùy thuộc vào ngữ cảnh, nó có thể được hiểu là biểu thức
mysql> CREATE TABLE `a``b` (`c"d` INT);
0 hoặc là số
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
9.

Hãy cẩn thận khi sử dụng

mysql> CREATE TABLE `a``b` (`c"d` INT);
2 để tạo tên bảng vì nó có thể tạo ra tên ở các định dạng bất hợp pháp hoặc mơ hồ như những người vừa được mô tả.

Một biến người dùng không thể được sử dụng trực tiếp trong câu lệnh SQL như một định danh hoặc là một phần của định danh. Xem Phần & NBSP; 9.4, các biến do người dùng xác định, để biết thêm thông tin và ví dụ về cách giải quyết.

Các ký tự đặc biệt trong tên cơ sở dữ liệu và tên bảng được mã hóa trong các tên hệ thống tệp tương ứng như được mô tả trong Phần & NBSP; 9.2.4, ánh xạ của các định danh vào tên tệp. Nếu bạn có cơ sở dữ liệu hoặc bảng từ phiên bản MySQL cũ hơn có chứa các ký tự đặc biệt và tên thư mục hoặc tên tệp cơ bản chưa được cập nhật để sử dụng mã hóa mới, máy chủ sẽ hiển thị tên của họ với tiền tố là

mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
9. Để biết thông tin về việc tham khảo các tên đó hoặc chuyển đổi chúng sang mã hóa mới hơn, hãy xem phần đó.