Apakah SQL case sensitif. Saya telah menggunakan MySQL dan SQL Server yang keduanya tampaknya tidak sensitif. Apakah ini selalu terjadi? Apakah standar mendefinisikan sensitivitas huruf besar-kecil?
sql
case-sensitive
Steve Tranby
sumber
sumber
Jawaban:
SQL Kata kunci adalah case-sensitive (
SELECT
,FROM
,WHERE
, dll), namun sering ditulis dalam semua topi. Namun dalam beberapa pengaturan, nama tabel dan kolom peka huruf besar-kecil. MySQL memiliki opsi konfigurasi untuk mengaktifkan / menonaktifkannya. Biasanya nama tabel dan kolom case-sensitive adalah default pada Linux MySQL dan case-insensitive digunakan sebagai default pada Windows, tetapi sekarang installer bertanya tentang hal ini selama setup. Untuk MSSQL itu adalah fungsi dari pengaturan susunan basis data.Berikut ini adalah halaman MySQL tentang sensitivitas huruf nama
Berikut adalah artikel di MSDN tentang pengumpulan untuk MSSQL
sumber
Ini bukan bahasa SQL, tetapi dalam SQL Server jika pemeriksaan basis data Anda peka huruf besar kecil, maka semua nama tabel peka huruf besar kecil.
sumber
Di Sql Server itu adalah opsi . Menyalakannya menyebalkan.
Saya tidak yakin tentang MySql.
sumber
Pengidentifikasi dan kata-kata yang dicadangkan tidak boleh peka huruf besar-kecil, meskipun banyak yang mengikuti konvensi untuk menggunakan huruf besar untuk kata-kata yang dipesan dan huruf Pascal untuk pengidentifikasi.
Lihat SQL-92 Sec. 5.2
sumber
The spesifikasi SQL92 menyatakan bahwa pengidentifikasi mungkin dikutip, atau kuotasi. Jika kedua belah pihak tidak dikutip maka mereka selalu peka huruf besar-kecil, misalnya
table_name == TAble_nAmE
.Namun pengidentifikasi yang dikutip adalah case-sensitive, misalnya
"table_name" != "TAble_naME"
. Juga berdasarkan spesifikasi jika Anda ingin membandingkan pengidentifikasi yang tidak di -quote dengan yang dikutip, maka pengidentifikasi yang tidak dikutip dan dikutip dapat dianggap sama, jika karakter yang tidak dikutip dituliskan dengan huruf besar, misalnyaTABLE_NAME == "TABLE_NAME"
, tetapiTABLE_NAME != "table_name"
atauTABLE_NAME != "TAble_NaMe"
.Berikut adalah bagian yang relevan dari spesifikasi (bagian 5.2.13):
Catatan, seperti halnya dengan bagian lain dari standar SQL, tidak semua database mengikuti bagian ini sepenuhnya. PostgreSQL misalnya menyimpan semua pengenal tanda kutip yang lebih kecil daripada yang lebih besar, jadi
table_name == "table_name"
(yang persis kebalikan dari standar). Juga beberapa basis data peka terhadap huruf besar-kecil setiap saat, atau sensitivitas huruf tergantung pada beberapa pengaturan dalam DB atau tergantung pada beberapa sifat sistem, biasanya apakah sistem file peka terhadap huruf besar atau kecil.Perhatikan bahwa beberapa alat basis data mungkin mengirim pengidentifikasi yang dikutip sepanjang waktu, jadi jika Anda mencampur kueri yang dihasilkan oleh beberapa alat (seperti kueri CREATE TABLE yang dihasilkan oleh Liquibase atau alat migrasi DB lainnya), dengan kueri buatan tangan (seperti JDBC sederhana pilih dalam aplikasi Anda) Anda harus memastikan bahwa kasus-kasus tersebut konsisten, terutama pada database di mana pengenal yang dikutip dan tidak dikutip berbeda (DB2, PostgreSQL, dll.)
sumber
Pemahaman saya adalah bahwa standar SQL membutuhkan case-insensitivity. Saya tidak percaya ada database yang mengikuti standar sepenuhnya.
MySQL memiliki pengaturan konfigurasi sebagai bagian dari "mode ketat" (tas jepit dari beberapa pengaturan yang membuat MySQL lebih sesuai standar) untuk nama tabel case case sensitif atau tidak sensitif. Terlepas dari pengaturan ini, nama-nama kolom masih tidak peka huruf besar-kecil, meskipun saya pikir itu mempengaruhi bagaimana nama-nama kolom ditampilkan. Saya percaya pengaturan ini adalah seluruh contoh, di semua database dalam contoh RDBMS, meskipun saya sedang meneliti hari ini untuk mengkonfirmasi ini (dan berharap jawabannya tidak).
Saya suka bagaimana Oracle menangani ini jauh lebih baik. Dalam SQL langsung, pengidentifikasi seperti nama tabel dan kolom tidak sensitif huruf. Namun, jika karena alasan tertentu Anda benar-benar ingin mendapatkan casing eksplisit, Anda dapat menyertakan pengenal dalam tanda kutip ganda (yang sangat berbeda dalam Oracle SQL dari tanda kutip tunggal yang digunakan untuk melampirkan data string). Begitu:
akan meminta fieldname dari tablename , tetapi
akan melakukan query fieldName dari tableName .
Saya cukup yakin Anda bahkan dapat menggunakan mekanisme ini untuk menyisipkan spasi atau karakter non-standar lainnya ke dalam pengidentifikasi.
Dalam situasi ini jika karena alasan tertentu Anda menemukan nama tabel dan kolom yang di-cased secara eksplisit diinginkan tersedia untuk Anda, tetapi itu masih sesuatu yang saya akan sangat waspadai.
Konvensi saya ketika saya menggunakan Oracle setiap hari adalah bahwa dalam kode saya akan meletakkan semua kata kunci Oracle SQL dalam huruf besar dan semua pengidentifikasi dalam huruf kecil. Dalam dokumentasi saya akan meletakkan semua nama tabel dan kolom dalam huruf besar. Sangat mudah dan mudah dibaca untuk dapat melakukan ini (walaupun kadang-kadang sulit untuk mengetik begitu banyak huruf besar dalam kode - saya yakin saya bisa menemukan fitur editor untuk membantu, di sini).
Menurut pendapat saya MySQL sangat buruk untuk membedakan tentang ini pada platform yang berbeda. Kita harus dapat membuang database pada Windows dan memuatnya ke UNIX, dan hal itu merupakan bencana jika installer pada Windows lupa untuk menempatkan RDBMS ke mode case-sensitive. (Agar adil, bagian dari alasan ini adalah bencana adalah pembuat kode kami membuat keputusan yang buruk, dahulu kala, untuk bergantung pada sensitivitas case dari MySQL pada UNIX.) Orang-orang yang menulis installer Windows MySQL membuatnya benar-benar nyaman dan Seperti Windows, dan itu bagus untuk bergerak ke arah memberi orang kotak centang untuk mengatakan "Apakah Anda ingin mengaktifkan mode ketat dan membuat MySQL lebih sesuai standar?" Tetapi sangat mudah bagi MySQL untuk berbeda secara signifikan dari standar, dan kemudian memperburuk masalah dengan berbalik dan berbeda dari standar de facto sendiri pada platform yang berbeda. Saya yakin bahwa pada distribusi Linux yang berbeda ini dapat lebih diperparah, karena pembuat paket untuk distro yang berbeda kadang-kadang telah memasukkan pengaturan konfigurasi MySQL pilihan mereka sendiri.
Inilah pertanyaan SO lain yang masuk ke diskusi apakah sensitivitas kasus diinginkan dalam RDBMS.
sumber
Tidak. MySQL tidak peka huruf besar-kecil, dan juga bukan standar SQL. Ini hanya praktik umum untuk menulis perintah huruf besar.
Sekarang, jika Anda berbicara tentang nama tabel / kolom, maka ya itu, tetapi bukan perintah itu sendiri.
Begitu
sama dengan
tapi tidak sama dengan
sumber
Saya menemukan posting blog ini sangat membantu (saya bukan penulis). Merangkum (harap baca, meskipun):
Dia menemukan DB2, Oracle dan Interbase / Firebird 100% sesuai:
sumber
Saya tidak berpikir SQL Server peka huruf besar-kecil, setidaknya tidak secara default.
Ketika saya bertanya secara manual melalui Management Studio, saya selalu mengacaukan kasing dan dengan senang hati menerimanya:
sumber
Kata kunci SQL itu sendiri tidak sensitif huruf.
Nama-nama tabel, kolom dll, memiliki sensitivitas case yang tergantung pada basis data - Anda mungkin harus berasumsi bahwa mereka case-sensitive kecuali Anda tahu sebaliknya (Dalam banyak basis data tidak demikian; pada tabel MySQL nama case case SOMETIMES peka tetapi kebanyakan lainnya nama tidak).
Membandingkan data menggunakan =,>, <dll, memiliki kesadaran kasus yang bergantung pada pengaturan pemeriksaan yang digunakan pada basis data individu, tabel atau bahkan kolom yang bersangkutan. Namun normal, untuk menjaga collation cukup konsisten dalam database. Kami memiliki beberapa kolom yang perlu menyimpan nilai case-sensitive; mereka memiliki susunan yang diatur secara khusus.
sumber
Miliki yang terbaik dari kedua dunia
Hari-hari ini Anda hanya dapat menulis semua pernyataan sql Anda dalam huruf kecil dan jika Anda perlu memformatnya maka instal plugin yang akan melakukannya untuk Anda. Ini hanya berlaku jika editor kode Anda memiliki plugin tersebut. VSCode memiliki banyak ekstensi yang dapat melakukan ini.
sumber