Tại sao tên bảng / cột / chỉ mục của Oracle giới hạn trong 30 ký tự?


149

Tôi có thể hiểu rằng nhiều năm trước sẽ có loại giới hạn này, nhưng ngày nay chắc chắn giới hạn này có thể dễ dàng tăng lên. Chúng ta có các quy ước đặt tên cho các đối tượng, nhưng luôn có một trường hợp xuất hiện khi chúng ta đạt đến giới hạn này - đặc biệt là trong việc đặt tên khóa ngoại.

Có ai thực sự biết tại sao đây không phải là một kích thước lớn hơn - hoặc nó lớn hơn trong 11g?


Rõ ràng câu trả lời là nó sẽ phá vỡ các tập lệnh hiện không được mã hóa. Tôi nói đó là một điều rất đáng lo ngại, Oracle đang cố gắng trở thành cơ sở dữ liệu, chắc chắn đây là điều mà bạn phải liên tục cải thiện, nếu không sản phẩm của bạn sẽ chết vì hàng ngàn vết cắt.

Bất cứ khi nào tôi thấy loại phản đối này trong nhà, tôi nghĩ rằng đã đến lúc cắn viên đạn và phân loại nó. Nếu mọi người đang chạy các tập lệnh mà họ không kiểm tra hoặc bảo trì khi nâng cấp các phiên bản Oracle, thì hãy để họ chịu hậu quả của lựa chọn đó. Cung cấp cho họ một cờ tương thích, tăng kích thước lên tới 4000, sau đó tiết kiệm cho tôi thời gian lãng phí khi tôi tạo các đối tượng phải liên tục đếm đến 30 để kiểm tra tên là 'OK'.


3
Vì cần phải có một giới hạn? Tạo thành 64 ký tự và có thể bạn sẽ tìm thấy ai đó hỏi tại sao không phải là 128, v.v. Một đoạn dây dài bao nhiêu?
Chủ tịch

45
Đúng, nhưng 30 là một đoạn rất ngắn của chuỗi. Tại sao nó không thể là 4000 - kích thước của Varchar2 - Oracle có thực sự quan tâm nó mất bao lâu một khi nó đã phân tích cú pháp truy vấn không?
Chris Gill

22
@TheChairman PostgreSQL giới hạn tôi tới 63 ký tự và tôi chưa bao giờ gặp vấn đề với giới hạn độ dài đó. Nó đủ lớn để tên của tôi phù hợp và nếu tôi đang xem xét một tên dài hơn, đã đến lúc bắt đầu suy nghĩ về tác động tiêu cực đến khả năng đọc. Mặt khác, tôi thường gặp phải giới hạn độ dài tên trong Oracle và buộc phải giảm khả năng đọc tên của tôi vì giới hạn 30 ký tự. Một số người có thể phàn nàn về giới hạn 64, nhưng rất nhiều người đã gặp vấn đề vì giới hạn 30 ký tự. Đó là về việc đáp ứng 99% các trường hợp sử dụng và Oracle đã thất bại ở đây.
jpmc26

1
Thôi nào, Oracle, bạn đã trở thành Khủng long! Microsoft đang làm một công việc tốt để làm cho máy chủ SQL trở nên thân thiện hơn. Bây giờ thư giãn giới hạn chiều dài tên.
dùng3454439

1
Chuyển nhanh tới Oracle 12cR2, giờ là 128 byte thay vì 30 :-) docs.oracle.com/en/database/oracle/oracle-database/12.2/newft/ trộm
Stefan L

Câu trả lời:


71

Tôi tin rằng đó là tiêu chuẩn ANSI.

BIÊN TẬP:

Trên thực tế, tôi nghĩ đó là tiêu chuẩn SQL-92.

Một phiên bản mới hơn của tiêu chuẩn dường như cho phép tùy ý cho 128 tên ký tự, nhưng Oracle chưa hỗ trợ điều này (hoặc có hỗ trợ một phần cho nó, trong trường hợp nó cho phép 30 ký tự. Hmmm.)

Tìm kiếm "F391, số nhận dạng dài" trên trang này ... http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/ap_stiteria_sql001.htm

(Tìm kiếm một ref)


1
Hmm, đó không phải là cách tôi đọc tài liệu đó. Nó nói với tôi rằng F391 là một mục trong thông số SQL / Foundation (bất kể đó là gì) và Oracle có hỗ trợ một phần cho nó, với giới hạn 30 ký tự.
skaffman

21
Tuân thủ một phần. Thật là một câu chuyện hài hước. "vít của chúng tôi tuân thủ một phần các tiêu chuẩn về số liệu, ngoại trừ chúng không phải là số liệu."
Jens Schauder

5
Tôi chưa đọc chi tiết về thông số F391, nhưng tôi cho rằng (có thể không chính xác) rằng "Số nhận dạng dài" có nghĩa là tăng độ dài số nhận dạng từ 30 lên 128. Vì vậy, nói rằng bạn "hỗ trợ một phần" điều này bằng cách cho phép 30 ký tự là một chút táo tợn. Bạn không ủng hộ tiêu chuẩn mới, bạn vẫn hỗ trợ tiêu chuẩn cũ (mặc dù 25% so với tiêu chuẩn mới) Điều đó có hợp lý không? !!?
cagcowboy

7
Tiêu chuẩn SQL-92 có ở đây contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt , nhưng nếu bạn đọc phần "17.1 Mô tả các khu vực mô tả mục SQL" thì nó cho biết các định danh như tên và lược đồ phải cho phép ít nhất 128 nhân vật.
Rick

46
Thực tế là các fanboy của Oracle không thấy sự hữu ích của hơn 30 định danh char là đáng lo ngại. "Làm cho tên của bạn có ý nghĩa / mô tả, sử dụng dấu gạch dưới thay vì vỏ lạc đà và ở dưới 30 ký tự". Điều đó sẽ không bao giờ đi quá 30 ký tự. Amirite? Giống như viết tắt chữ viết tắt của bạn và khi không có tên nào có ý nghĩa, hãy dành cả ngày để đọc / cập nhật tài liệu.
Adam Jones

45

Ngoài quan điểm của cagcowboy rằng nó xuất phát từ tiêu chuẩn SQL (về mặt lịch sử, tôi nghi ngờ rằng quyết định của Oracle dẫn đến tiêu chuẩn SQL vì Oracle đã dự đoán tiêu chuẩn hóa SQL), tôi sẽ đặt ra rằng một phần lớn sự miễn cưỡng cho phép nhận dạng dài hơn đến từ việc nhận ra rằng có hàng triệu DBA với hàng triệu tập lệnh tùy chỉnh mà tất cả đều cho rằng số nhận dạng dài 30 ký tự. Cho phép mọi dòng mã đi giống như

  l_table_name VARCHAR2(30);
BEGIN
  SELECT table_name
    INTO l_table_name
    FROM dba_tables
   WHERE ...

đột nhiên bị phá vỡ vì DBA 15 năm trước đã sử dụng VARCHAR2 (30) thay vì DBA_TABLES.TABLE_NAME%TYPEtrong kịch bản sẽ gây ra cuộc nổi loạn lớn. Tôi cá rằng một mình Oracle có hàng ngàn nơi mà loại điều này đã được thực hiện trong nhiều năm qua trong các gói và thành phần khác nhau. Retrofitting tất cả những mã để hỗ trợ định danh còn tồn tại sẽ là một dự án rất lớn mà gần như chắc chắn sẽ tạo ra cách chi phí nhiều hơn trong thời gian phát triển, thời gian QA, và lỗi mới được giới thiệu hơn nó sẽ tạo ra lợi ích.


13
+1 Đây gần như chắc chắn là một trong nhiều tật nguyền thiết kế di sản của Oracle.
skaffman

43
Chắc chắn đã đến lúc phát triển một cặp và tăng nó - thêm một lá cờ để các DBA có thể tinh chỉnh nó xuống còn 30. Các vấn đề di sản như thế này phải luôn được đối mặt và sắp xếp nếu không bạn sẽ làm tê liệt toàn bộ cơ sở mã, và mọi người sẽ di chuyển vào một cái gì đó khác
Chris Gill

6
Không chỉ có hàng triệu dòng mã viết DBA, mà còn rất nhiều mã nội bộ tiên tri. Chủ đề này đã được đưa ra trong một phiên với steven feuerstein và ông nói rằng ông không nghĩ họ sẽ thay đổi nó.
Matthew Watson

10
Họ chính xác không thể thổi kèn nó như một tính năng mới, ... họ sẽ dành nhiều thời gian để mở rộng giới hạn, và sau đó thông báo "bây giờ bạn có thể sử dụng tên dài hơn 30 ký tự!". Họ sẽ trở thành trò cười.
skaffman

9
Nếu bạn vẫn đang sử dụng các tập lệnh 15 tuổi, điều gì đó cực kỳ sai . Ngoài ra, sửa chúng sẽ là một chi phí một lần (có thể thêm một số chi phí để tiếp tục bảo trì), trong khi các nhà phát triển sẽ tiếp tục lãng phí thời gian một cách không cần thiết để tạo ra các tên viết tắt khủng khiếp vô thời hạn. @skaffman Họ đã là một trò cười cho không sửa chữa nó (và một loạt các quyết định thiết kế khác mà là thảm hại trong thời kỳ hiện đại, giống như không có loại boolean hoặc auto-incrementing), như xa như tôi đang quan tâm.
jpmc26

11

Tôi đã tìm kiếm câu hỏi này và tìm thấy câu hỏi này thông qua Google, nhưng cũng phát hiện ra rằng kể từ phiên bản Oracle 12c Phiên bản 2 (12.2), đây không còn là vấn đề nghiêm trọng nữa. ( https://oracle-base.com/articles/12c/long-identifier-12cr2 )

Tại một số điểm, mọi DBA hoặc nhà phát triển sẽ đạt đến điểm giới hạn 30 ký tự cho tên đối tượng đã gây ra sự cố. Giới hạn này có thể cực kỳ đau đớn khi thực hiện các dự án di chuyển từ SQL Server hoặc MySQL sang Oracle. Trong Cơ sở dữ liệu Oracle 12cR2, độ dài tối đa của hầu hết các mã định danh hiện là 128 ký tự.

Đây là một tính năng mới trong 12.2, theo ( http://blog.dbi-service.com/oracle-12cr2-long-identifier/ ). Theo bài đăng đó, 12.1 vẫn bị giới hạn ở 30 ký tự.


Chỉnh sửa: Đây là một liên kết đến tài liệu chính thức của Oracle giải thích về sự thay đổi. ( https://docs.oracle.com/cloud/latest/exadataexpress-cloud/CSDBF/longer-identifier-names.htmlm#CSDBF-GUID-F4CA155F-5A37-4705-8443-0A8C9E3F875C )

Bắt đầu với Cơ sở dữ liệu Oracle 12c Phiên bản 2 (12.2), độ dài tối đa của tên định danh cho hầu hết các loại đối tượng cơ sở dữ liệu đã được tăng lên 128 byte.


128 byte / 4 byte (Unicode) = 32 Ký tự. Ít nhất sự hiểu biết của tôi là 4 byte cho các ký tự không phải là Unicode không phổ biến? Tôi phải tự hỏi nếu điều đó chỉ có nghĩa là bây giờ họ đang hỗ trợ Unicode? Cũng giống như VARCHAR2(2)không có nghĩa là 2 ký tự nhưng 2 byte.
Seth

1
Tôi thấy quan điểm của bạn, nhưng các ký tự và byte không phụ thuộc vào bộ ký tự cơ sở dữ liệu của bạn. Cài đặt đó xác định mã hóa cho kiểu dữ liệu char (chẳng hạn như varchar2) cũng như mã hóa cho mã định danh db. Điều này trái ngược với bộ ký tự quốc gia, được sử dụng cho các kiểu dữ liệu nchar. Vì vậy, nếu bạn có một mã hóa sao cho số nhận dạng của bạn đang sử dụng 4 byte cho mỗi ký tự (giả sử có thể được sử dụng như bộ ký tự DB), thì bây giờ bạn sẽ có 32 thay vì 7. Nhưng tôi nghĩ đối với hầu hết các số nhận dạng trường hợp sử dụng sẽ là ký tự byte đơn.
Kanmuri

6

Do sự cần thiết thực tế của giới hạn độ dài định danh, thiết kế tốt sẽ hạn chế độ dài của tên thực để tránh chạm trần khi các tên được kết hợp với nhau và có tiền tố và hậu tố.

Ví dụ: quy ước đặt tên ràng buộc khóa ngoại

FK_<table1>_<table2> 

giới hạn tên bảng từ 13 ký tự trở xuống; hầu hết các cơ sở dữ liệu sẽ cần nhiều tiền tố và hậu tố hơn, hạn chế hơn nữa độ dài của tên bảng.


5

Vi phạm ràng buộc được báo cáo trong SQLERRM, giới hạn ở 255 ký tự và hầu hết các máy khách sử dụng để hiển thị lỗi. Tôi nghi ngờ việc tăng kích thước cho phép của các tên ràng buộc sẽ ảnh hưởng đáng kể đến khả năng báo cáo về các vi phạm (đặc biệt là khi vi phạm ràng buộc đã được đưa lên qua một vài lớp mã PL / SQL).


Vì vậy, uh, làm cho bảng đó rộng hơn, sau đó?
skaffman

2
Đó không phải là một bảng, nhưng làm thế nào phần mềm máy khách thực sự gặp lỗi từ cơ sở dữ liệu.
Gary Myers

@skaffman Độ dài SQLERRM là một đặc tả API / ABI. Thay đổi điều này có nghĩa là phải vá mọi trình điều khiển OCI trên hành tinh (bộ đệm khác bị tràn). Họ có thể đưa ra sự thay đổi cho khách hàng để tăng buflen trong OCI 13 trước và máy chủ trong một cái gì đó như Oracle 15, nơi khách hàng OCI 10 sẽ không còn được hỗ trợ, tôi cho rằng. (Có thể họ thậm chí đang xem xét nó ngay bây giờ, nhưng phiên bản chính của oracle chỉ phát hành vài năm một lần; và sau đó chúng tôi vẫn có thể gặp phải sự đau đớn khi nâng cấp tập lệnh / ứng dụng khi các ứng dụng được chuyển sang máy chủ / máy khách khác nhau).
cowbert

4

Tôi tin rằng độ dài nhận dạng 30 ký tự đến từ COBOL đã được chuẩn hóa vào cuối những năm 1950. Vì các chương trình COBOL là người dùng chính của SQL (và SEQUEL trước đó (và QUEL trước đó)), nên đây có vẻ như là một con số hợp lý cho độ dài định danh.


5
Tôi tin rằng phiên bản đầu tiên của Oracle được viết bằng Fortran, mà tôi nghĩ có giới hạn độ dài định danh là 31. Có lẽ điều đó có liên quan.
David Aldridge

4

Tất cả những 'ràng buộc' này đều là những phản hồi còn sót lại đối với các giới hạn được áp đặt bởi các kiến ​​trúc bộ xử lý xuất phát từ những năm 70. Vì thời gian đó bộ xử lý đã phát triển đến mức những hạn chế này không còn cần thiết nữa; họ chỉ còn lại Tuy nhiên, thay đổi chúng là một thỏa thuận LỚN cho các tác giả của RDBMS. Vì các giới hạn độ dài này ảnh hưởng đến mọi thứ ở hạ lưu, nên nó sẽ thay đổi thành một tên thủ tục dài hơn và có thể sẽ phá vỡ rất nhiều thứ khác như báo cáo thực thi, từ điển dữ liệu, v.v. Tôi sẽ yêu cầu viết lại chính RDBMS của Oracle.


2

Câu trả lời trực tiếp cho câu hỏi là phong cách Oracle được kế thừa từ những ý tưởng cũ hơn trong đó 30 dường như rất nhiều, và nhiều hơn nữa sẽ làm tăng nguy cơ bỏ ghim bộ đệm từ điển từ bộ nhớ thực trong cơ sở dữ liệu thông thường.

Ngược lại, không gian tên ODBC đến từ một nơi rất khác, nơi các bộ dữ liệu được trích xuất nhanh chóng bằng cách phân tích một bảng trong một bảng Excel và tự động xây dựng các bảng cơ sở dữ liệu với các tên cột được lấy từ các tiêu đề của bảng. Suy nghĩ như vậy dẫn bạn đến việc cho phép các định danh thậm chí có chứa lợi nhuận vận chuyển nhúng, và tất nhiên là các ký tự đặc biệt và trường hợp hỗn hợp. Đó là một sự trừu tượng hợp lý bởi vì nó mô hình hóa cách suy nghĩ của các nhà phân tích dữ liệu ngày nay.

Đừng bận tâm đến SQL92, việc tuân thủ ODBC thực sự quan trọng đối với cơ sở dữ liệu phổ quát ngày nay và các nhà cung cấp khác đã giải quyết vấn đề này tốt hơn Oracle. Ví dụ, ngay cả Teradata, không được nhiều người xem là người chơi phổ biến, phục vụ cho các không gian tên TWO, có và không có dấu ngoặc kép, trước đây có giới hạn 30 char, sau đó là một triển khai ODBC đầy đủ trong đó các định danh dài kỳ lạ được phục vụ cho .

Ngay cả trong lĩnh vực cơ sở dữ liệu lớn truyền thống, 30 ký tự thường là một vấn đề trong đó các tên phải duy trì ý nghĩa, nhất quán và đáng nhớ. Khi bạn bắt đầu thiết kế các cấu trúc chuyên biệt với sự kế thừa tên vai trò, bạn bắt đầu viết tắt các chữ viết tắt và tính nhất quán sẽ sớm chết, vì ví dụ, cùng một mã định danh gốc được hiển thị dưới dạng tên bảng hoặc tên cột trong một trường hợp sẽ không cần viết tắt và trong trường hợp khác thì không viết tắt . Nếu người dùng thực sự với số lượng đáng kể được mời vào các lớp như vậy thì hậu quả là khả năng sử dụng rất kém, và may mắn thay cho bất kỳ cơ sở dữ liệu cũ nào, ổ đĩa chính bây giờ là tách người dùng khỏi cơ sở dữ liệu thông qua các lớp đối tượng và công cụ BI.

Điều này để lại lớp cơ sở dữ liệu cho DBA và các nhóm kiến ​​trúc sư dữ liệu, những người có lẽ không bận tâm lắm. Làm việc ra các kế hoạch viết tắt vẫn là một công việc cho cuộc sống, dường như.

Việc Oracle không giải quyết được giới hạn cũ này có lẽ phản ánh chủ yếu về thực tế rằng nó vẫn chưa (chưa) mất đi nhiều lợi thế cạnh tranh khi không thể trực tiếp thiết kế cơ sở dữ liệu được xây dựng bằng cách sử dụng các định danh dài hơn.


Không vào Oracle. ODBC là một đứa trẻ của Microsoft, không phải là một Java. Nó vẫn là một trình trợ giúp lib riêng biệt được liên kết với OCI (xem cách thức triển khai tức thời - để ODBC hoạt động với tính năng tức thời, bạn cần cả trình điều khiển OCI và khóa kéo tức thời ODBC). Nền tảng máy khách chính của Oracle (bên cạnh Legacy Pro * C / C / C ++) là JDBC, được liên kết trực tiếp với OCI, không phải ODBC.
cowbert

1

Tất cả các ý kiến ​​trên là đúng, NHƯNG bạn cần ghi nhớ chi phí hiệu suất của tên dài hơn. Đầu những năm 1990, khi Informix thành lập bảng quảng cáo khổng lồ "Informix nhanh hơn Oracle!" trên tuyến đường 101 bên cạnh trụ sở chính của Oracle, Informix chỉ cho phép tên bảng ngắn hơn 18 ký tự! Lý do rất rõ ràng - tên bảng ở dạng nghĩa đen của chúng (nghĩa là tên thực tế thay vì 't138577321' hoặc một cái gì đó giống như vậy) được lưu trữ trong Từ điển dữ liệu. Tên dài hơn bằng với Từ điển dữ liệu lớn hơn và vì Từ điển dữ liệu được đọc mỗi lần truy vấn yêu cầu phân tích cú pháp cứng, từ điển dữ liệu lớn hơn tương đương với hiệu suất kém ...


7
Hoàn toàn không có lý do nào cho việc kết hợp chính xác các chuỗi ngắn là một nút cổ chai trong bất kỳ phần mềm hiện đại nào trừ khi bạn đang thực hiện nó hàng tỷ lần mà không phải là trường hợp trong phân tích cú pháp truy vấn. Các cân nhắc về hiệu suất kích thước có thể có ý nghĩa khi phần này của Oracle được thiết kế lần đầu tiên, nhưng chúng không thực sự phù hợp trong những ngày này.
Sarah G

-7

ok, giới hạn tồn tại ....

nhưng bạn có thực sự CẦN hơn 30 ký tự để đặt tên cho bảng / chỉ mục / cột không ??

khi viết truy vấn, với giới hạn đó, tôi VẪN thấy một số tên cột / bảng gây phiền nhiễu. Nếu giới hạn cao hơn, tôi có thể chạy vào các bảng yêu cầu truy vấn như:

select unique_identifier_column, 
time_when_the_user_remembered_to_change_the_row_in_the_receipt_table, 
foreign_key_to_the_ap_invoice_distributions_history_table_related_to_the_all_rows_table 
from ap_invoices_really_really_all_all_rows_present_in_this_ebs_table.

Tôi xin lỗi vì những từ rất lớn: P


29
Sẽ thật tuyệt khi có thể đặt tên khóa ngoại bằng tên của cả bảng và cột mà chúng tham gia - do đó, khi ném ngoại lệ khóa ngoại, bạn không phải tìm các cột gây ra lỗi. Sau đó, một lần nữa Oracle chỉ có thể cho bạn biết thông tin đó ...
Chris Gill

10
Có nhiều lý do tại sao chúng ta cần nhiều hơn 30 ký tự, mặc dù thông thường 30 ký tự là đủ. Đôi khi một tên bảng cần phải đủ dài để có ý nghĩa. Ví dụ: tôi có bảng này gọi sch_PotypeRunTimeException, nó dài chính xác 30 ký tự. Bây giờ, tôi cần thêm một bảng phản chiếu cuộc gọi sch_DevPotypeRunTimeException. Tiêu chuẩn đặt tên thêm 3 ký tự này không hoạt động cho Oracle, MSSQL không có vấn đề gì. Điều này buộc tôi phải nghĩ ra một cái tên mới. Đổi tên bảng là có thể thực hiện được, nhưng nó sẽ ảnh hưởng đến hoạt động của khách hàng, điều mà chúng tôi cố gắng tránh.
DSum

6
Nếu trong 99,9% phần trăm các trường hợp có thể xảy ra +30 ký tự gây phiền nhiễu thì không có nghĩa là họ sẽ có ích 0,1% còn lại.
René Nyffalanger

14
Ahhh lập luận dốc slippy. Giới hạn chỉ có 4 ký tự chữ và số sẽ giúp chúng tôi có hơn 1 triệu kết hợp bảng để không ai thực sự "cần" hơn 4. Tuy nhiên, chúng tôi đang ở đây. Và nó không thực sự là 30 ký tự, nó ít hơn 30 ký tự kể từ khi quy ước đặt tên trường hợp pascal của tôi phải bỏ đi với sự thiếu nhạy cảm trường hợp và được thay thế bằng các tên được phân tách bằng dấu gạch dưới. Kết hợp điều đó với các tiền tố / hậu tố khác nhau và bạn may mắn có được 20 ký tự. Ai sẽ không muốn một tên chỉ mục mạnh mẽ lặp lại với một lỗi vi phạm trong một loạt các chữ viết tắt và dấu gạch dưới?
b_levitt

Đồng ý điều này không giải quyết vấn đề. Thông thường con người không cần tên cột dài hơn, nhưng có rất nhiều trường hợp tên đối tượng được tạo tự động.
crazy4jesus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.