Hướng dẫn mysql table name limitations - giới hạn tên bảng 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, 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 xuất 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 a`b 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]
0:

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]
1E 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]
1E
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]
3, 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]
4 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]
3 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]
6 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]
7 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 "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 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]
7.

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

mysql> CREATE TABLE `a``b` [`c"d` INT];
0 để 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];
1 để đả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.

9.2.3 & nbsp; độ nhạy của trường hợp định danh

Trong MySQL, cơ sở dữ liệu tương ứng với các thư mục trong thư mục dữ liệu. Mỗi bảng trong cơ sở dữ liệu tương ứng với ít nhất một tệp trong thư mục cơ sở dữ liệu [và có thể nhiều hơn, tùy thuộc vào công cụ lưu trữ]. Trình kích hoạt cũng tương ứng với các tập tin. Do đó, độ nhạy trường hợp của hệ điều hành cơ bản đóng một phần trong độ nhạy trường hợp của cơ sở dữ liệu, bảng và tên kích hoạt. Điều này có nghĩa là những cái tên như vậy không nhạy cảm với trường hợp trong Windows, nhưng nhạy cảm với trường hợp trong hầu hết các giống UNIX. Một ngoại lệ đáng chú ý là macOS, dựa trên UNIX nhưng sử dụng loại hệ thống tệp mặc định [HFS+] không nhạy cảm trường hợp. Tuy nhiên, MacOS cũng hỗ trợ khối lượng UFS, có tính nhạy cảm với trường hợp giống như trên bất kỳ Unix nào. Xem Phần & NBSP; 1.7.1, Phần mở rộng MySQL cho SQL tiêu chuẩn. Biến hệ thống

mysql> CREATE TABLE `a``b` [`c"d` INT];
2 cũng ảnh hưởng đến cách máy chủ xử lý độ nhạy của trường hợp định danh, như được mô tả sau trong phần này.

Ghi chú

Mặc dù cơ sở dữ liệu, bảng và tên kích hoạt không nhạy cảm với trường hợp trên một số nền tảng, bạn không nên đề cập đến một trong số này bằng cách sử dụng các trường hợp khác nhau trong cùng một câu lệnh. Tuyên bố sau đây sẽ không hoạt động vì nó đề cập đến một bảng cả là

mysql> CREATE TABLE `a``b` [`c"d` INT];
3 và AS
mysql> CREATE TABLE `a``b` [`c"d` INT];
4:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

Phân vùng, phân vùng, cột, chỉ mục, thường xuyên được lưu trữ, sự kiện và tên nhóm tài nguyên không nhạy cảm với bất kỳ nền tảng nào, cũng không phải là bí danh cột.

Tuy nhiên, tên của các nhóm logfile là nhạy cảm trường hợp. Điều này khác với SQL tiêu chuẩn.

Theo mặc định, các bí danh bảng có tính nhạy cảm với trường hợp trên Unix, nhưng không phải như vậy trên Windows hoặc MacOS. Tuyên bố sau đây sẽ không hoạt động trên Unix, bởi vì nó đề cập đến bí danh cả

mysql> CREATE TABLE `a``b` [`c"d` INT];
5 và
mysql> CREATE TABLE `a``b` [`c"d` INT];
6:

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;

Tuy nhiên, câu lệnh tương tự này được cho phép trên Windows. Để tránh các vấn đề gây ra bởi sự khác biệt như vậy, tốt nhất là áp dụng một quy ước nhất quán, chẳng hạn như luôn luôn tạo và đề cập đến cơ sở dữ liệu và bảng sử dụng tên chữ thường. Công ước này được khuyến nghị cho tính di động tối đa và dễ sử dụng.

Cách các tên bảng và cơ sở dữ liệu được lưu trữ trên đĩa và được sử dụng trong MySQL bị ảnh hưởng bởi biến hệ thống

mysql> CREATE TABLE `a``b` [`c"d` INT];
2.
mysql> CREATE TABLE `a``b` [`c"d` INT];
2 có thể lấy các giá trị được hiển thị trong bảng sau. Biến này không ảnh hưởng đến độ nhạy trường hợp của số nhận dạng kích hoạt. Trên Unix, giá trị mặc định là
mysql> CREATE TABLE `a``b` [`c"d` INT];
2 là 0. Trên Windows, giá trị mặc định là 1. Trên macOS, giá trị mặc định là 2.not affect case sensitivity of trigger identifiers. On Unix, the default value of
mysql> CREATE TABLE `a``b` [`c"d` INT];
2 is 0. On Windows, the default value is 1. On macOS, the default value is 2.

mysql> CREATE TABLE `a``b` [`c"d` INT];
2 chỉ có thể được cấu hình khi khởi tạo máy chủ. Thay đổi cài đặt
mysql> CREATE TABLE `a``b` [`c"d` INT];
2 sau khi máy chủ được khởi tạo bị cấm.

Giá trịNghĩa
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
2
Tên bảng và cơ sở dữ liệu được lưu trữ trên đĩa bằng cách sử dụng Lettercase được chỉ định trong câu lệnh
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
3 hoặc
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
4. So sánh tên là nhạy cảm trường hợp. Bạn không nên đặt biến này thành 0 nếu bạn đang chạy MySQL trên một hệ thống có tên tệp không phân biệt chữ hoa chữ thường [như Windows hoặc MacOS]. Nếu bạn buộc biến này thành 0 với
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
5 trên hệ thống tệp không nhạy cảm trường hợp và truy cập
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
6 Table bằng cách sử dụng các bản ngữ khác nhau, tham nhũng chỉ mục có thể dẫn đến.not set this variable to 0 if you are running MySQL on a system that has case-insensitive file names [such as Windows or macOS]. If you force this variable to 0 with
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
5 on a case-insensitive file system and access
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
6 tablenames using different lettercases, index corruption may result.
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
7
Tên bảng được lưu trữ bằng chữ thường trên đĩa và so sánh tên không nhạy cảm trường hợp. MySQL chuyển đổi tất cả các tên bảng thành chữ thường khi lưu trữ và tra cứu. Hành vi này cũng áp dụng cho tên cơ sở dữ liệu và bí danh bảng.
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
8
Tên bảng và cơ sở dữ liệu được lưu trữ trên đĩa bằng cách sử dụng Lettercase được chỉ định trong câu lệnh
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
3 hoặc
mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+
4, nhưng MySQL chuyển đổi chúng thành chữ thường khi tra cứu. So sánh tên không nhạy cảm với trường hợp. Điều này chỉ hoạt động trên các hệ thống tệp không nhạy cảm với trường hợp!
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
1 Tên bảng và tên xem được lưu trữ bằng chữ thường, như đối với
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
2.only on file systems that are not case-sensitive!
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
1 table names and view names are stored in lowercase, as for
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
2.

Nếu bạn đang sử dụng MySQL trên một nền tảng, bạn thường không phải sử dụng cài đặt

mysql> CREATE TABLE `a``b` [`c"d` INT];
2 ngoài mặc định. Tuy nhiên, bạn có thể gặp khó khăn nếu bạn muốn chuyển bảng giữa các nền tảng khác nhau về độ nhạy của trường hợp hệ thống tệp. Ví dụ: trên Unix, bạn có thể có hai bảng khác nhau có tên
mysql> CREATE TABLE `a``b` [`c"d` INT];
3 và
mysql> CREATE TABLE `a``b` [`c"d` INT];
4, nhưng trên Windows, hai tên này được coi là giống hệt nhau. Để tránh các vấn đề truyền dữ liệu phát sinh từ thư của cơ sở dữ liệu hoặc tên bảng, bạn có hai tùy chọn:

  • Sử dụng

    mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
    2 trên tất cả các hệ thống. Nhược điểm chính với điều này là khi bạn sử dụng
    mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
    7 hoặc
    mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
    8, bạn không thấy tên trong Lettercase ban đầu của họ.

  • Sử dụng

    mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
    9 trên Unix và
    mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;
    0 trên Windows. Điều này bảo tồn thư của cơ sở dữ liệu và tên bảng. Nhược điểm của điều này là bạn phải đảm bảo rằng các câu lệnh của bạn luôn đề cập đến cơ sở dữ liệu và tên bảng của bạn với chữ cái chính xác trên Windows. Nếu bạn chuyển các câu lệnh của mình sang Unix, nơi Lettercase có ý nghĩa, chúng không hoạt động nếu Lettercase không chính xác.

    Ngoại lệ: Nếu bạn đang sử dụng các bảng

    mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
    1 và bạn đang cố gắng tránh các vấn đề truyền dữ liệu này, bạn nên sử dụng
    mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
    2 trên tất cả các nền tảng để buộc các tên được chuyển đổi thành chữ thường.
    : If you are using
    mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
    1 tables and you are trying to avoid these data transfer problems, you should use
    mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
    2 on all platforms to force names to be converted to lowercase.

Tên đối tượng có thể được coi là trùng lặp nếu các dạng viết hoa của chúng bằng nhau theo một đối chiếu nhị phân. Điều đó đúng với tên của con trỏ, điều kiện, quy trình, chức năng, điểm lưu, các tham số thường xuyên được lưu trữ, các biến cục bộ chương trình được lưu trữ và plugin. Nó không đúng với tên của các cột, ràng buộc, cơ sở dữ liệu, phân vùng, câu lệnh được chuẩn bị với

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
3, bảng, trình kích hoạt, người dùng và các biến do người dùng xác định.

Độ nhạy của trường hợp hệ thống tệp có thể ảnh hưởng đến các tìm kiếm trong các cột chuỗi của bảng

mysql> SELECT col_name FROM tbl_name AS a
       WHERE a.col_name = 1 OR A.col_name = 2;
4. Để biết thêm thông tin, xem Phần & NBSP; 10.8.7, Sử dụng đối chiếu trong thông tin_schema tìm kiếm.

Bài Viết Liên Quan

Chủ Đề