กรณีของไวยากรณ์ SQL นั้นสำคัญหรือไม่


199

SQL case สำคัญหรือไม่ ฉันใช้ MySQL และ SQL Server ซึ่งทั้งคู่ดูเหมือนจะเป็นกรณี ๆ ไป เป็นเช่นนี้เสมอหรือไม่ มาตรฐานกำหนดตัวพิมพ์ใหญ่ - เล็กหรือไม่


คำตอบ:


181

ของ SQL คำหลักเป็นกรณีตาย ( SELECT, FROM, WHEREฯลฯ ) แต่มักจะถูกเขียนในตัวพิมพ์ใหญ่ทั้งหมด อย่างไรก็ตามในบางตารางการตั้งค่าและชื่อคอลัมน์จะคำนึงถึงขนาดตัวพิมพ์ MySQL มีตัวเลือกการกำหนดค่าเพื่อเปิด / ปิดการใช้งาน โดยปกติแล้วชื่อตารางและคอลัมน์เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่จะเป็นค่าเริ่มต้นบน Linux MySQL และตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ที่ใช้เป็นค่าเริ่มต้นบน Windows แต่ตอนนี้ผู้ติดตั้งถามเกี่ยวกับสิ่งนี้ระหว่างการติดตั้ง สำหรับ MSSQL มันเป็นฟังก์ชั่นของการตั้งค่าการเปรียบเทียบของฐานข้อมูล

นี่คือหน้า MySQL เกี่ยวกับตัวพิมพ์ใหญ่ - เล็ก

นี่คือบทความใน MSDN เกี่ยวกับการเรียงหน้าสำหรับ MSSQL


7
ระบบบางระบบ (เช่น PostgreSQL) คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ในชื่อตารางและคอลัมน์ แต่พยายามซ่อนผ่านตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ทั้งหมดก่อนที่จะค้นหา ในระบบเหล่านี้คุณจะต้องใส่ชื่อตารางใน "เครื่องหมายคำพูดคู่" เพื่อให้แน่ใจว่าชื่อที่แน่นอนที่คุณป้อนถูกค้นหา
Michael Ratanapintha

2
"แต่มักจะถูกเขียนในตัวพิมพ์ใหญ่ทั้งหมด" ผมไม่เห็นว่าเป็นเพียงการตั้งค่าที่ฉันได้เห็นเสมอตรงข้ามจริง
BlackTigerX

3
ตัวอย่างเช่นหากเซิร์ฟเวอร์ MS Sql ถูกติดตั้งโดยใช้การเปรียบเทียบขนาดตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แล้วตารางคอลัมน์ชื่อตัวแปรจะคำนึงถึงขนาดตัวพิมพ์
Vadym Stetsiak

3
@BlackTigerX - คู่มือ Oracle มีตัวอย่าง SQL ทั้งหมดที่มีคำหลัก (SELECT, FROM, WHERE, ฯลฯ ) ที่เขียนเป็นตัวพิมพ์ใหญ่ แต่ชื่อตารางและคอลัมน์ในตัวพิมพ์เล็ก
J. Polfer

อืมมันยังเป็นจริงของ mysql ใช่ไหม ฉันคิดว่าฉันมีการติดตั้งเริ่มต้นของ mysql และมันไม่ตรงตามตัวพิมพ์ใหญ่ - เล็กสำหรับชื่อคอลัมน์
Kzqai

22

นี่ไม่ใช่ภาษา SQL อย่างเคร่งครัด แต่ใน SQL Server หากการเปรียบเทียบฐานข้อมูลของคุณเป็นกรณี ๆ ไปแล้วชื่อตารางทั้งหมดจะเป็นกรณี ๆ ไป


16

ใน SQL Server มันเป็นตัวเลือก การเปิดใช้งานบน sucks

ฉันไม่แน่ใจเกี่ยวกับ MySql


ใน MySql ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เป็นตัวเลือกที่คุณสามารถเปิดและปิดได้ เพียงแค่ว่า insensitivity นั้นไม่ทำงานตามที่คุณคิดว่าจะทำบน Linux หากระบบไฟล์เป็นแบบตรงตัวพิมพ์ คุณต้องสร้างระบบไฟล์แบบคำนึงถึงขนาดตัวพิมพ์บน Linux เพื่อให้ตัวพิมพ์เล็กและตัวพิมพ์เล็กทำงานแบบเดียวกับบน windows (= ถูกต้อง) โดยเฉพาะอย่างยิ่งการเปิด / ปิดหลังจากการทำงานในโหมดอื่นอาจส่งผลเสีย
Stefan Steiger

14

ตัวบ่งชี้และคำที่สงวนไว้ไม่ควรคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่แม้ว่าหลายคนจะทำตามแบบแผนเพื่อใช้ตัวพิมพ์ใหญ่สำหรับคำที่สงวนไว้

ดูSQL-92 Sec 5.2


13

ข้อกำหนด SQL92ระบุตัวบ่งชี้ว่าอาจจะมีการยกหรือ unquoted หากทั้งสองฝ่ายไม่table_name == TAble_nAmEได้รับการโควต

ตัวระบุ แต่ที่ยกมาเป็นกรณี ๆ "table_name" != "TAble_naME"เช่น นอกจากนี้ยังขึ้นอยู่กับสเปคถ้าคุณต้องการที่จะเปรียบเทียบตัวระบุ unqouted กับคนที่ยกมาแล้ว unquoted และอ้างตัวระบุสามารถพิจารณาเดียวกันถ้าตัวละคร unquoted จะ uppercased เช่นTABLE_NAME == "TABLE_NAME"แต่หรือTABLE_NAME != "table_name"TABLE_NAME != "TAble_NaMe"

นี่คือส่วนที่เกี่ยวข้องของข้อมูลจำเพาะ (ส่วน 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>".

โปรดทราบว่าเช่นเดียวกับส่วนอื่น ๆ ของมาตรฐาน SQL ฐานข้อมูลบางส่วนเท่านั้นที่จะทำตามส่วนนี้ทั้งหมด ตัวอย่างเช่น PostgreSQL เก็บตัวระบุที่ไม่ได้อ้างอิงทั้งหมดให้ลดลงแทนที่จะเป็นตัวพิมพ์ใหญ่ดังนั้นtable_name == "table_name"(ซึ่งตรงกันข้ามกับมาตรฐาน) นอกจากนี้ฐานข้อมูลบางตัวยังคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ตลอดเวลาหรือขึ้นอยู่กับการตั้งค่าบางอย่างในฐานข้อมูลหรือขึ้นอยู่กับคุณสมบัติบางอย่างของระบบโดยปกติแล้วระบบไฟล์จะคำนึงถึงขนาดตัวพิมพ์หรือไม่

โปรดทราบว่าเครื่องมือฐานข้อมูลบางอย่างอาจส่งตัวระบุที่ยกมาตลอดเวลาดังนั้นในกรณีที่คุณผสมแบบสอบถามที่สร้างขึ้นโดยเครื่องมือบางอย่าง (เช่นแบบสอบถาม CREATE TABLE ที่สร้างโดย Liquibase หรือเครื่องมือย้ายข้อมูล DB อื่น ๆ ) ด้วยแบบสอบถามที่ทำด้วยมือ ในแอปพลิเคชันของคุณ) คุณต้องตรวจสอบให้แน่ใจว่ากรณีและปัญหานั้นสอดคล้องกันโดยเฉพาะอย่างยิ่งในฐานข้อมูลที่ตัวระบุที่ยกมาและไม่ได้ระบุไว้นั้นแตกต่างกัน (DB2, PostgreSQL เป็นต้น)


10

ความเข้าใจของฉันคือว่ามาตรฐาน SQL ต้องการตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ฉันไม่เชื่อว่าฐานข้อมูลใด ๆ ที่เป็นไปตามมาตรฐานอย่างสมบูรณ์แม้ว่า

MySQL มีการตั้งค่าคอนฟิเกอเรชันซึ่งเป็นส่วนหนึ่งของ "โหมดเข้มงวด" (grab bag ของการตั้งค่าต่าง ๆ ที่ทำให้ MySQL เป็นไปตามมาตรฐานมากขึ้น) สำหรับชื่อตารางหรือแบบตัวพิมพ์เล็ก ไม่คำนึงถึงการตั้งค่านี้ชื่อคอลัมน์ยังคงไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก แต่ฉันคิดว่ามันมีผลกับการแสดงชื่อคอลัมน์ ฉันเชื่อว่าการตั้งค่านี้เป็นแบบกว้างทั้งฐานข้อมูลทั้งหมดภายในอินสแตนซ์ของ RDBMS แม้ว่าฉันจะทำการวิจัยในวันนี้เพื่อยืนยันสิ่งนี้ (และหวังว่าคำตอบจะไม่ใช่)

ฉันชอบวิธีที่ออราเคิลจัดการได้ดีกว่านี้มาก ใน SQL แบบตรงตัวระบุเช่นชื่อตารางและคอลัมน์จะไม่ตรงตามตัวพิมพ์เล็กและใหญ่ อย่างไรก็ตามถ้าด้วยเหตุผลบางประการที่คุณต้องการรับปลอกอย่างชัดเจนคุณสามารถใส่ตัวระบุในเครื่องหมายคำพูดคู่ (ซึ่งค่อนข้างแตกต่างใน Oracle SQL จากเครื่องหมายคำพูดเดี่ยวที่ใช้เพื่อใส่ข้อมูลสตริง) ดังนั้น:

SELECT fieldName
FROM tableName;

จะสืบค้นชื่อฟิลด์จากแท็บเล็ต แต่

SELECT "fieldName"
FROM "tableName";

จะสอบถามfieldnameจากtableName

ฉันค่อนข้างมั่นใจว่าคุณสามารถใช้กลไกนี้เพื่อแทรกช่องว่างหรืออักขระที่ไม่ได้มาตรฐานอื่น ๆ ลงในตัวระบุได้

ในสถานการณ์นี้หากมีเหตุผลบางอย่างที่คุณพบชื่อตารางและคอลัมน์ที่ระบุอย่างชัดเจนว่าเป็นที่ต้องการมีให้คุณ แต่ก็ยังเป็นสิ่งที่ฉันจะต้องระมัดระวังอย่างมาก

การประชุมของฉันเมื่อฉันใช้ Oracle ทุกวันคือในรหัสฉันจะใส่คำหลัก Oracle SQL ทั้งหมดเป็นตัวพิมพ์ใหญ่และตัวระบุทั้งหมดเป็นตัวพิมพ์เล็ก ในเอกสารฉันจะใส่ชื่อตารางและคอลัมน์ทั้งหมดเป็นตัวพิมพ์ใหญ่ มันสะดวกมากและสามารถอ่านได้ (แม้ว่าบางครั้งความเจ็บปวดในการพิมพ์ตัวอักษรจำนวนมากในรหัส - ฉันแน่ใจว่าฉันได้พบคุณสมบัติตัวแก้ไขเพื่อช่วยที่นี่)

ในความคิดของฉัน MySQL ไม่ดีอย่างยิ่งสำหรับความแตกต่างเกี่ยวกับเรื่องนี้ในแพลตฟอร์มที่แตกต่างกัน เราจำเป็นต้องสามารถถ่ายโอนฐานข้อมูลบน Windows และโหลดลงใน UNIX และการทำเช่นนั้นถือเป็นความเสียหายหากผู้ติดตั้งบน Windows ลืมที่จะนำ RDBMS เข้าสู่โหมดตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (เพื่อความเป็นธรรมส่วนหนึ่งของเหตุผลนี้คือความหายนะคือ coders ของเราได้ทำการตัดสินใจที่ไม่ดีเมื่อนานมาแล้วขึ้นอยู่กับ case-sensitive ของ MySQL บน UNIX) คนที่เขียนโปรแกรมติดตั้ง Windows MySQL ทำให้สะดวกและ เหมือน Windows และเป็นการดีมากที่จะให้กล่องกาเครื่องหมายแก่ผู้คนเพื่อพูดว่า "คุณต้องการเปิดโหมดที่เข้มงวดและทำให้ MySQL เป็นไปตามมาตรฐานมากขึ้นหรือไม่" แต่มันสะดวกสำหรับ MySQL ที่จะแตกต่างกันอย่างมากดังนั้นลงชื่อจากมาตรฐาน แล้วทำให้เรื่องแย่ลงโดยหันไปรอบ ๆ และแตกต่างจากมาตรฐานพฤตินัยของตัวเองบนแพลตฟอร์มที่แตกต่างกัน ฉันแน่ใจว่าการกระจายลีนุกซ์ที่แตกต่างกันนี้อาจมีการเพิ่มเติมอีกเนื่องจากผู้ทำแพ็กเกจสำหรับ distros ที่แตกต่างกันอาจมีบางครั้งที่รวมการตั้งค่า MySQL ที่พวกเขาต้องการ

ต่อไปนี้เป็นคำถาม SO อีกข้อที่จะพิจารณาว่าตัวพิมพ์เล็กและตัวพิมพ์ใหญ่นั้นเป็นที่ต้องการใน RDBMS หรือไม่


5

ไม่ MySQL ไม่ต้องตรงตามตัวพิมพ์ใหญ่ - เล็กและไม่มีมาตรฐาน SQL เป็นเรื่องธรรมดาที่จะเขียนคำสั่งเป็นตัวพิมพ์ใหญ่

ตอนนี้ถ้าคุณกำลังพูดถึงชื่อตาราง / คอลัมน์แล้วใช่พวกเขา แต่ไม่ใช่คำสั่งด้วยตนเอง

ดังนั้น

SELECT * FROM foo;

เป็นเช่นเดียวกับ

select * from foo;

แต่ไม่เหมือนกัน

select * from FOO;

2
ใน RDBMS ส่วนใหญ่ชื่อตารางจะไม่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก อย่างน้อยก็ไม่ใช่โดยปริยาย MySQL เป็นข้อยกเว้นที่โดดเด่นที่สุดสำหรับกฎนี้

4

ฉันพบว่าการโพสต์บล็อกนี้มีประโยชน์มาก (ฉันไม่ใช่ผู้เขียน) การสรุป (โปรดอ่าน):

... ตัวระบุที่คั่นด้วยตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ("table_name"! = "Table_Name") ในขณะที่ไม่ใช่ตัวระบุที่ยกมาไม่ได้และจะถูกแปลงเป็นตัวพิมพ์ใหญ่ (table_name => TABLE_NAME)

เขาพบว่า DB2, Oracle และ Interbase / Firebird สอดคล้องกับ 100%:

PostgreSQL ... ลดตัวระบุที่ไม่ได้อ้างอิงทั้งหมดลงไปแทนที่จะเป็นตัวพิมพ์ใหญ่ MySQL ... ขึ้นอยู่กับระบบไฟล์ SQLite และ SQL Server ... กรณีของชื่อตารางและฟิลด์จะถูกสงวนไว้ในการสร้าง แต่จะถูกละเว้นอย่างสมบูรณ์หลังจากนั้น


2

ฉันไม่คิดว่า SQL Server เป็นกรณี ๆ ไปอย่างน้อยก็ไม่ใช่ตามค่าเริ่มต้น

เมื่อฉันสอบถามด้วยตนเองผ่านทาง Management Studio ฉันทำเรื่องยุ่งเหยิงตลอดเวลาและยอมรับอย่างมีความสุข:

select cOL1, col2 FrOM taBLeName WheRE ...

2

คำหลัก SQL นั้นคำนึงถึงขนาดตัวพิมพ์

ชื่อของตารางคอลัมน์ ฯลฯ มีความไวตัวพิมพ์ใหญ่ - เล็กซึ่งขึ้นอยู่กับฐานข้อมูล - คุณอาจจะคิดว่ามันเป็นแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ยกเว้นในกรณีที่คุณทราบเป็นอย่างอื่น (ในหลายฐานข้อมูล ชื่อไม่ได้)

การเปรียบเทียบข้อมูลโดยใช้ =,>, <etc มีการรับรู้กรณีซึ่งขึ้นอยู่กับการตั้งค่าการเรียงที่ใช้ในฐานข้อมูลแต่ละตารางหรือคอลัมน์แม้ในคำถาม เป็นเรื่องปกติอย่างไรก็ตามเพื่อให้การเปรียบเทียบมีความสอดคล้องอย่างเป็นธรรมภายในฐานข้อมูล เรามีคอลัมน์ไม่กี่คอลัมน์ที่จำเป็นต้องเก็บค่าตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ พวกเขามีการเปรียบเทียบชุดโดยเฉพาะ


0

มีทั้งโลกที่ดีที่สุด

วันนี้คุณสามารถเขียนคำสั่ง sql ทั้งหมดของคุณเป็นตัวพิมพ์เล็กและหากคุณจำเป็นต้องจัดรูปแบบมันให้ติดตั้งปลั๊กอินที่จะทำเพื่อคุณ สิ่งนี้ใช้ได้เฉพาะในกรณีที่โปรแกรมแก้ไขรหัสของคุณมีปลั๊กอินเหล่านั้น VSCodeมีส่วนขยายมากมายที่สามารถทำได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.