Mengapa nama tabel / kolom / indeks Oracle dibatasi hingga 30 karakter?


149

Saya bisa mengerti bahwa bertahun-tahun yang lalu akan ada batasan semacam ini, tetapi saat ini pasti batas ini dapat dengan mudah ditingkatkan. Kami memiliki konvensi penamaan untuk objek, tetapi selalu ada kasus yang muncul di mana kami mencapai batas ini - terutama dalam penamaan kunci asing.

Adakah yang benar-benar tahu mengapa ini bukan ukuran yang lebih besar - atau lebih besar dalam 11g?


Tampaknya jawabannya adalah bahwa itu akan merusak skrip yang saat ini tidak memiliki kode pertahanan. Saya mengatakan bahwa adalah hal yang sangat mengkhawatirkan, Oracle sedang mencoba untuk menjadi yang basis data, pasti ini adalah jenis hal yang Anda harus terus-menerus meningkatkan, jika produk Anda akan mati kematian seribu luka.

Setiap kali saya melihat keberatan semacam ini di rumah, saya pikir sudah waktunya untuk menggigit peluru dan mengatasinya. Jika orang menjalankan skrip yang tidak mereka periksa atau pelihara ketika mereka memutakhirkan versi Oracle, maka biarkan mereka menderita konsekuensi dari pilihan itu. Memberi mereka flag kompatibilitas, naik ukuran hingga 4000, lalu menyelamatkan saya waktu terbuang ketika saya membuat objek karena harus terus-menerus menghitung hingga 30 untuk memeriksa nama apakah 'OK'.


3
Karena perlu ada batasan? Buatlah 64 karakter dan Anda mungkin akan menemukan seseorang yang bertanya mengapa itu bukan 128 dll. Berapa lama seutas tali?
Ketua

45
Benar, tetapi 30 adalah seutas tali yang sangat pendek. Mengapa tidak bisa 4000 - ukuran Varchar2 - apakah Oracle benar-benar peduli berapa lama setelah permintaannya diuraikan?
Chris Gill

22
@TheChairman PostgreSQL membatasi saya hingga 63 karakter, dan saya tidak pernah punya masalah dengan batas panjang itu. Cukup besar sehingga nama saya cocok, dan jika saya mempertimbangkan nama yang lebih panjang, saatnya untuk mulai memikirkan dampak negatif pada keterbacaan. Di sisi lain, saya sering mengalami batas panjang nama di Oracle dan saya terpaksa mengurangi keterbacaan nama saya karena batas 30 karakter. Beberapa orang mungkin mengeluh tentang batas 64, tetapi banyak orang sudah memiliki masalah karena batas 30 karakter. Ini tentang memenuhi 99% kasus penggunaan, dan Oracle gagal di sini.
jpmc26

1
Ayolah, Oracle, Anda telah menjadi Dinosaurus! Microsoft melakukan pekerjaan yang baik untuk membuat server SQL lebih ramah. Sekarang kendalikan batasan panjang nama.
user3454439

1
Maju cepat ke Oracle 12cR2, sekarang 128 byte, bukan 30 :-) docs.oracle.com/en/database/oracle/oracle-database/12.2/newft/…
Stefan L

Jawaban:


71

Saya percaya itu adalah standar ANSI.

EDIT:

Sebenarnya, saya pikir itu standar SQL-92.

Versi standar yang lebih baru tampaknya secara opsional memungkinkan untuk 128 nama karakter, tetapi Oracle belum mendukung ini (atau memiliki dukungan parsial untuk itu, sejauh memungkinkan 30 karakter. Hmmm.)

Cari "F391, Long identifiers" di halaman ini ... http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/ap_standard_sql001.htm

(Mencari ref)


1
Hmm, bukan itu cara saya membaca dokumen itu. Ia mengatakan kepada saya bahwa F391 adalah item dalam spesifikasi SQL / Foundation (apa pun itu), dan bahwa Oracle memiliki dukungan parsial untuknya, dengan batas 30 karakter.
skaffman

21
Kepatuhan sebagian. Benar-benar lelucon. "sekrup kami sebagian memenuhi standar metrik, kecuali sekrup tidak metrik."
Jens Schauder

5
Saya belum membaca spesifikasi F391 secara terperinci, tapi saya berasumsi (mungkin salah) bahwa "pengidentifikasi panjang" berarti peningkatan panjang pengidentifikasi dari 30 menjadi 128. Jadi, mengatakan bahwa Anda "sebagian" mendukung ini dengan mengizinkan 30 karakter adalah sedikit kurang ajar. Anda tidak mendukung standar baru, Anda masih mendukung standar lama (meskipun 25% dari jalan ke standar baru) Apakah itu masuk akal? !!?
cagcowboy

7
Standar SQL-92 ada di sini contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt , tetapi jika Anda membaca bagian "17.1 Deskripsi area deskriptor item SQL" katanya pengidentifikasi seperti nama dan skema harus memungkinkan setidaknya 128 karakter.
Rick

46
Fakta bahwa fanboys Oracle tidak melihat kegunaan 30+ pengidentifikasi karakter sangat mengganggu. "Jadikan nama Anda bermakna / deskriptif, gunakan garis bawah alih-alih kasing unta, dan tetap di bawah 30 karakter". Itu tidak akan pernah melebihi 30 karakter. Amir? Lebih seperti menyingkat singkatan Anda dan ketika tidak ada nama yang masuk akal, habiskan sepanjang hari membaca / memperbarui dokumentasi.
Adam Jones

45

Selain poin cagcowboy yang berasal dari standar SQL (secara historis, saya menduga bahwa keputusan Oracle mengarah ke standar SQL sejak Oracle mendahului standardisasi SQL), saya akan bertaruh bahwa sebagian besar keengganan untuk mengizinkan pengidentifikasi yang lebih lama berasal dari kesadaran bahwa ada jutaan DBA dengan jutaan skrip khusus yang semuanya menganggap bahwa pengidentifikasi memiliki panjang 30 karakter. Mengizinkan setiap baris kode seperti itu

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

untuk tiba-tiba pecah karena DBA 15 tahun yang lalu menggunakan VARCHAR2 (30) daripada DBA_TABLES.TABLE_NAME%TYPEdalam naskah akan menyebabkan pemberontakan besar-besaran. Saya berani bertaruh bahwa Oracle sendiri memiliki ribuan tempat di mana hal semacam ini telah dilakukan selama bertahun-tahun dalam berbagai paket dan komponen. Memperbaiki semua kode yang ada untuk mendukung pengidentifikasi yang lebih lama akan menjadi proyek luar biasa yang hampir pasti akan menghasilkan biaya yang jauh lebih banyak dalam waktu pengembang, waktu QA, dan bug yang baru diperkenalkan daripada yang akan menghasilkan manfaat.


13
+1 Ini hampir pasti salah satu dari banyak cacat desain warisan Oracle.
skaffman

43
Tentunya saatnya untuk menumbuhkan pasangan dan meningkatkannya - tambahkan bendera sehingga DBA dapat memperbaikinya kembali ke 30. Masalah warisan seperti ini harus selalu dikonfrontasi dan disortir jika tidak, Anda akhirnya melumpuhkan seluruh basis kode, dan orang hanya akan memindahkan ke sesuatu yang lain
Chris Gill

6
Bukan hanya jutaan baris kode tertulis DBA, tetapi banyak kode internal oracle tidak diragukan juga. Topik ini muncul dalam sesi dengan steven feuerstein dan dia berkata dia tidak berpikir mereka akan pernah mengubahnya.
Matius Watson

10
Mereka tidak dapat benar-benar meneriakkannya sebagai fitur baru, baik ... mereka akan menghabiskan banyak waktu untuk memperpanjang batas, dan kemudian mengumumkan "Anda sekarang dapat menggunakan nama lebih dari 30 karakter!". Mereka akan menjadi bahan tertawaan.
skaffman

9
Jika Anda masih menggunakan skrip berusia 15 tahun, ada sesuatu yang sangat salah . Juga, memperbaikinya akan menjadi biaya satu kali (mungkin dengan lebih banyak untuk pemeliharaan lanjutan), sementara pengembang akan terus membuang-buang waktu dengan sia-sia membuat nama yang disingkat mengerikan tanpa batas. @skaffman Mereka sudah menjadi bahan tertawaan karena tidak memperbaikinya (dan sejumlah keputusan desain lain yang menyedihkan di era modern, seperti tidak ada tipe boolean atau auto-incrementing), sejauh yang saya ketahui.
jpmc26

11

Saya mencari ini dan menemukan pertanyaan ini melalui Google, tetapi juga menemukan bahwa pada Oracle 12c Release 2 (12.2), ini tidak lagi menjadi masalah. ( https://oracle-base.com/articles/12c/long-identifiers-12cr2 )

Pada titik tertentu setiap DBA atau pengembang akan mencapai titik di mana batas 30 karakter untuk nama objek telah menyebabkan masalah. Batas ini bisa sangat menyakitkan ketika melakukan proyek migrasi dari SQL Server atau MySQL ke Oracle. Dalam Oracle Database 12cR2, panjang maksimum dari kebanyakan pengidentifikasi sekarang 128 karakter.

Ini adalah fitur baru dalam 12.2, menurut ( http://blog.dbi-services.com/oracle-12cr2-long-identifiers/ ). Menurut posting itu, 12.1 masih terbatas hingga 30 karakter.


Sunting: Berikut ini tautan ke dokumentasi Oracle resmi yang menjelaskan perubahan tersebut. ( https://docs.oracle.com/cloud/latest/exadataexpress-cloud/CSDBF/longer-identifier-names.htm#CSDBF-GUID-F4CA155F-5A37-4705-8443-0A8C9E3F875C )

Dimulai dengan Oracle Database 12c Release 2 (12.2), panjang maksimum nama pengidentifikasi untuk sebagian besar jenis objek basis data telah ditingkatkan menjadi 128 byte.


128 byte / 4 byte (Unicode) = 32 Karakter. Setidaknya pemahaman saya adalah bahwa 4 byte untuk karakter non Unicode bukankah itu tidak umum? Saya harus bertanya-tanya apakah itu hanya berarti mereka mendukung Unicode sekarang? Sama seperti VARCHAR2(2)tidak berarti 2 karakter tetapi 2 byte.
Seth

1
Saya mengerti maksud Anda, tetapi karakter vs byte tergantung pada kumpulan karakter basis data Anda. Pengaturan itu menentukan pengkodean untuk tipe data char (seperti varchar2) serta pengkodean untuk pengidentifikasi db. Ini kontras dengan set karakter nasional, yang digunakan untuk tipe data nchar. Jadi ya, jika Anda memiliki pengkodean sehingga pengidentifikasi Anda menggunakan 4 byte per karakter (dengan asumsi dapat digunakan sebagai set karakter DB), Anda sekarang akan memiliki 32 bukannya 7. Tapi saya pikir untuk sebagian besar kasus penggunaan pengidentifikasi akan karakter byte tunggal.
Kanmuri

6

Mengingat kebutuhan praktis dari batas panjang pengidentifikasi, desain yang baik membatasi panjang nama sebenarnya untuk menghindari memukul langit-langit ketika nama-nama tersebut digabungkan satu sama lain dan dengan awalan dan sufiks.

Misalnya, konvensi penamaan batasan kunci asing

FK_<table1>_<table2> 

membatasi nama tabel hingga 13 karakter atau kurang; kebanyakan database akan membutuhkan lebih banyak awalan dan sufiks, yang selanjutnya membatasi panjang nama tabel.


5

Pelanggaran kendala dapat dilaporkan dalam SQLERRM yang dibatasi hingga 255 karakter, dan yang digunakan sebagian besar klien untuk membuat kesalahan terlihat. Saya menduga meningkatkan ukuran nama kendala yang diijinkan secara signifikan akan berdampak pada kemampuan untuk melaporkan pelanggaran (terutama di mana pelanggaran kendala telah digelembungkan melalui beberapa lapisan kode PL / SQL).


Jadi, eh, buatkan meja itu lebih lebar, kalau begitu?
skaffman

2
Ini bukan tabel, tetapi bagaimana perangkat lunak klien benar-benar mendapatkan kesalahan dari database.
Gary Myers

Panjang @skaffman SQLERRM adalah spesifikasi API / ABI. Mengubah ini berarti harus menambal setiap driver OCI di planet ini (jika buffer overrun). Mereka dapat menempatkan perubahan pada klien untuk meningkatkan buflen di OCI 13 pertama dan server dalam sesuatu seperti Oracle 15, di mana klien OCI 10 tidak lagi didukung, saya kira. (Mungkin mereka bahkan mempertimbangkannya sekarang, tetapi versi oracle utama hanya merilis setiap beberapa tahun; dan kemudian kita mungkin masih mengalami kesulitan upgrade skrip / aplikasi ketika aplikasi dimigrasi ke server / klien yang berbeda).
cowbert

4

Saya percaya bahwa panjang 30 karakter pengidentifikasi berasal dari COBOL yang distandarisasi pada akhir 1950-an. Karena program COBOL adalah pengguna utama SQL (dan SEQUEL sebelum itu (dan QUEL sebelum itu)), ini pasti tampak seperti angka yang masuk akal untuk panjang pengidentifikasi.


5
Saya percaya versi pertama Oracle ditulis dalam Fortran, yang saya pikir memiliki batas panjang pengidentifikasi 31. Mungkin itu relevan.
David Aldridge

4

Semua 'kendala' ini merupakan tanggapan atas batasan yang diberlakukan oleh arsitektur prosesor yang berasal dari tahun 70-an. Sejak saat itu prosesor telah berevolusi ke titik bahwa batasan ini tidak lagi diperlukan; mereka hanya tersisa. Namun, mengubah mereka adalah masalah besar bagi para penulis RDBMS. Karena batasan panjang ini memengaruhi segalanya di hilir, maka tidak perlu lagi untuk mengakomodasi, katakanlah nama prosedur yang lebih panjang dapat dan mungkin akan memecah banyak hal lain seperti pelaporan eksekusi, kamus data, dll., Seterusnya dan seterusnya. Saya akan membutuhkan penulisan ulang Oracle RDBMS.


2

Jawaban langsung untuk pertanyaan ini adalah bahwa gaya Oracle diwarisi dari ide-ide lama di mana 30 tampaknya banyak, dan lebih banyak lagi akan meningkatkan risiko melepaskan pin cache kamus dari memori nyata dalam database biasa.

Sebaliknya, namespace ODBC berasal dari tempat yang sangat berbeda, di mana set data diekstraksi dengan cepat dengan menguraikan tabel dalam lembar Excel dan secara otomatis membangun tabel database dengan nama kolom yang diambil dari judul tabel lembar. Berpikir seperti itu menuntun Anda untuk memungkinkan pengidentifikasi yang bahkan mengandung carriage return yang dikembalikan, dan tentu saja karakter khusus dan case campuran. Ini adalah abstraksi yang masuk akal karena memodelkan cara berpikir analis data saat ini.

Tidak masalah SQL92, kepatuhan ODBC yang benar-benar penting untuk database universal saat ini, dan vendor lain telah mengatasi ini lebih baik daripada Oracle. Bahkan Teradata, misalnya, yang tidak dilihat oleh banyak orang sebagai pemain luas, melayani untuk dua ruang nama, dengan dan tanpa tanda kutip, yang pertama dengan batas 30 char, yang terakhir implementasi ODBC penuh di mana pengidentifikasi panjang yang aneh dipenuhi .

Bahkan di arena basis data besar tradisional, 30 karakter sering menjadi masalah di mana nama tetap bermakna, konsisten, dan mudah diingat. Setelah Anda mulai merancang struktur khusus dengan pewarisan peran-peran, Anda mulai menyingkat singkatan, dan konsistensi segera mati, karena misalnya pengidentifikasi akar yang sama yang dirender sebagai nama tabel atau nama kolom dalam satu kasus akan memerlukan singkatan lebih lanjut dan yang lain tidak . Jika pengguna nyata dalam jumlah yang signifikan diundang ke lapisan seperti itu konsekuensinya adalah kegunaan yang sangat buruk, dan untungnya untuk setiap basis data penuaan, drive utama sekarang adalah untuk memisahkan pengguna dari basis data melalui lapisan objek dan alat BI.

Ini meninggalkan lapisan basis data untuk DBA dan tim arsitek data, yang mungkin tidak terlalu peduli. Mengerjakan skema singkatan masih merupakan pekerjaan seumur hidup, tampaknya.

Bahwa Oracle belum mengatasi batasan lama ini mungkin sebagian besar mencerminkan fakta bahwa ia belum (belum) kehilangan banyak bisnis karena pesaingnya ketika tidak dapat secara langsung mem-porting desain basis data yang dibangun menggunakan pengidentifikasi yang lebih lama.


Bukan untuk Oracle. ODBC adalah bayi Microsoft, bukan bayi Jawa. Ini masih merupakan lib pembantu terpisah yang dikaitkan dengan OCI (lihat bagaimana instantclient digunakan - untuk membuat ODBC bekerja dengan klien instan, Anda memerlukan driver OCI dan ritsleting instantclient ODBC). Platform klien utama Oracle (selain legacy Pro * C / C / C ++) adalah JDBC, yang terhubung langsung ke OCI, bukan ODBC.
cowbert

1

Semua komentar di atas benar, TETAPI Anda perlu mengingat biaya kinerja dari nama yang lebih panjang. Pada awal 1990-an, ketika Informix membuat papan iklan besar "Informix Faster Than Oracle!" pada rute 101 di sebelah kantor pusat Oracle, Informix mengizinkan nama tabel hanya lebih pendek dari 18 karakter! Alasannya jelas - nama tabel dalam bentuk literal mereka (yaitu sebagai nama sebenarnya daripada 't138577321'atau sesuatu seperti itu) disimpan dalam Kamus Data. Nama yang lebih panjang sama dengan Kamus Data yang lebih besar, dan karena Kamus Data dibaca setiap kali kueri membutuhkan parse keras, kamus data yang lebih besar sama dengan kinerja yang buruk ...


7
Sama sekali tidak ada alasan untuk pencocokan string pendek yang tepat untuk menjadi hambatan dalam setiap perangkat lunak modern kecuali jika Anda melakukannya miliaran kali — yang tidak terjadi pada penguraian kueri. Pertimbangan ukuran-kinerja mungkin signifikan ketika bagian dari Oracle ini pertama kali dirancang, tetapi mereka tidak benar-benar relevan hari ini.
Sarah G

-7

ok, batasannya ada ....

tetapi apakah Anda benar-benar MEMBUTUHKAN lebih dari 30 karakter untuk memberi nama tabel / indeks / kolom ??

saat menulis pertanyaan, dengan batasan itu saya MASIH menemukan beberapa nama kolom / tabel yang mengganggu. Jika batasnya lebih tinggi saya mungkin mengalami tabel yang membutuhkan kueri seperti:

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.

Saya minta maaf atas kata-kata besar: P


29
Alangkah baiknya untuk dapat memberi nama kunci asing dengan nama-nama baik tabel dan kolom yang mereka gabungkan - oleh karena itu ketika pengecualian kunci asing dilemparkan, Anda tidak perlu mencari kolom yang menyebabkan kegagalan. Kemudian lagi Oracle hanya bisa memberitahu Anda info yang ...
Chris Gill

10
Ada banyak alasan mengapa kita membutuhkan lebih dari 30 karakter, walaupun biasanya 30 karakter sudah cukup. Kadang-kadang nama tabel harus cukup verbose agar bermakna. Sebagai contoh, saya punya panggilan tabel ini sch_PatternRunTimeException, panjangnya persis 30 karakter. Sekarang, saya perlu menambahkan panggilan tabel mirroring sch_DevPatternRunTimeException. Standar penamaan 3 karakter tambahan ini tidak berfungsi untuk Oracle, MSSQL tidak memiliki masalah. Ini memaksa saya untuk datang dengan nama baru. Mengganti nama tabel bisa dilakukan, tetapi itu akan berdampak pada operasi pelanggan kami, yang kami coba hindari.
dsum

6
Jika dalam 99,9% persen dari kemungkinan kasus +30 karakter menjengkelkan tidak berarti mereka akan berguna 0,1% lainnya.
René Nyffenegger

14
Ahhh argumen slippy slope. Batas hanya 4 karakter alfanumerik yang dapat menghasilkan lebih dari 1 juta kombinasi tabel sehingga tidak ada yang benar-benar "membutuhkan" lebih dari 4. Namun di sinilah kita. Dan sebenarnya bukan 30 karakter, kurang dari 30 karakter karena konvensi penamaan case pascal saya harus dibuang dengan kurangnya sensitivitas case dan diganti dengan nama garis bawah yang dibatasi. Kombinasikan itu dengan berbagai awalan / sufiks dan Anda beruntung memiliki 20 karakter. Siapa yang tidak suka nama indeks yang kuat bergema dengan kesalahan pelanggaran atas campur aduk singkatan dan garis bawah?
b_levitt

Setuju ini tidak membahas masalah ini. Biasanya manusia tidak membutuhkan nama kolom yang lebih panjang, tetapi ada banyak kasus di mana nama objek dihasilkan secara otomatis.
fool4jesus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.