Apakah sintaksis kasus SQL sensitif?

Jawaban:

181

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

Stefan Rusek
sumber
7
Beberapa sistem (seperti PostgreSQL) peka huruf besar-kecil dalam nama tabel dan kolom, tetapi cobalah untuk menyembunyikannya melalui huruf kecil atau huruf besar semua nama sebelum melihatnya. Pada sistem ini Anda harus menyertakan nama tabel dalam "tanda kutip ganda" untuk memastikan nama yang Anda masukkan terlihat.
Michael Ratanapintha
2
"tetapi sering ditulis dalam huruf besar semua" Saya tidak setuju, itu hanya preferensi, saya selalu melihat yang sebenarnya
BlackTigerX
3
Misalnya jika server MS Sql diinstal menggunakan collation case sensitif, maka tabel, kolom, nama variabel menjadi case sensitif, bahkan jika database memiliki collation tidak sensitif case.
Vadym Stetsiak
3
@ BlackTigerX - Manual Oracle memiliki semua contoh SQL dengan kata kunci (SELECT, FROM, WHERE, dll) ditulis dalam huruf besar tetapi nama tabel dan kolom dalam huruf kecil.
J. Polfer
Hmmm, apakah ini masih berlaku untuk mysql? Saya pikir saya memiliki instal default mysql, dan tidak sensitif huruf untuk nama kolom.
Kzqai
22

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.

Cade Roux
sumber
16

Di Sql Server itu adalah opsi . Menyalakannya menyebalkan.

Saya tidak yakin tentang MySql.

JosephStyons
sumber
Di MySql, ketidakpekaan huruf adalah opsi yang dapat Anda nyalakan dan matikan. Hanya saja ketidakpekaan itu tidak berfungsi seperti yang Anda asumsikan akan lakukan di Linux jika sistem file case-sensitive (default). Anda harus membuat sistem file case-insensitive di Linux agar mysql case-insensitivity bekerja dengan cara yang sama seperti pada windows (= dengan benar). Terutama menyalakan / mematikannya setelah beberapa pekerjaan dalam satu mode lain dapat menanggung konsekuensi buruk.
Stefan Steiger
14

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

Penjaga penjara
sumber
13

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, misalnya TABLE_NAME == "TABLE_NAME", tetapi TABLE_NAME != "table_name"atau TABLE_NAME != "TAble_NaMe".

Berikut adalah bagian yang relevan dari spesifikasi (bagian 5.2.13):

     13)A <regular identifier> and a <delimited identifier> are equiva-
        lent if the <identifier body> of the <regular identifier> (with
        every letter that is a lower-case letter replaced by the equiva-
        lent upper-case letter or letters) and the <delimited identifier
        body> of the <delimited identifier> (with all occurrences of
        <quote> replaced by <quote symbol> and all occurrences of <dou-
        blequote symbol> replaced by <double quote>), considered as
        the repetition of a <character string literal> that specifies a
        <character set specification> of SQL_TEXT and an implementation-
        defined collation that is sensitive to case, compare equally
        according to the comparison rules in Subclause 8.2, "<comparison
        predicate>".

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.)

SztupY
sumber
10

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:

SELECT fieldName
FROM tableName;

akan meminta fieldname dari tablename , tetapi

SELECT "fieldName"
FROM "tableName";

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.

skiphoppy
sumber
5

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

SELECT * FROM foo;

sama dengan

select * from foo;

tapi tidak sama dengan

select * from FOO;
cmcculloh
sumber
2
Di sebagian besar RDBMS, nama tabel juga tidak peka huruf besar-kecil. Setidaknya tidak secara default. MySQL adalah pengecualian paling menonjol untuk aturan ini.
4

Saya menemukan posting blog ini sangat membantu (saya bukan penulis). Merangkum (harap baca, meskipun):

... pengidentifikasi terbatas adalah case-sensitive ("table_name"! = "Table_Name"), sedangkan pengidentifikasi yang tidak dikutip tidak, dan ditransformasikan ke huruf besar (table_name => TABLE_NAME).

Dia menemukan DB2, Oracle dan Interbase / Firebird 100% sesuai:

PostgreSQL ... menurunkan setiap pengenal yang tidak dikutip, alih-alih membuat huruf besar. MySQL ... tergantung pada sistem file. SQLite dan SQL Server ... kasus tabel dan nama field disimpan pada pembuatan, tetapi mereka benar-benar diabaikan setelahnya.

Matthew Cornell
sumber
2

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:

select cOL1, col2 FrOM taBLeName WheRE ...
Dana
sumber
2

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.

MarkR
sumber
0

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.

Isaac Pak
sumber