PostgreSQL สามารถสร้างฐานข้อมูลได้หรือไม่


10

ฉันกำลังย้ายโค้ดจาก Sybase ไปยัง PostgreSQL บางเวอร์ชัน นี่เป็นแอปพลิเคชั่น C ที่ใช้ไลบรารีไคลเอ็นต์ Sybase แนวทางของฉันคือการเขียนเลเยอร์การแปลที่แปลการโทรไปdbsqlexec()ที่PQexec()(ตัวอย่าง) ส่วนนั้นทำงานได้เป็นส่วนใหญ่

ปรากฏว่ามีการตั้งค่าฐานข้อมูล Sybase ในลักษณะที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (เกี่ยวกับชื่อวัตถุฐานข้อมูล) ตัวอย่างเช่นมีทั้งWIDGETตารางและwidgetตาราง ดูเหมือนว่าการประชุมในแอพพลิเคชั่นนี้นั้นชื่อ all-uppercase จะระบุตารางข้อมูลจริงในขณะที่ชื่อตัวพิมพ์เล็กจะถูกใช้เป็นตารางชั่วคราวเมื่อทำการประมวลผล

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

มีวิธีการตั้งค่า PostgreSQL เพื่อปิดใช้งานตัวพิมพ์เล็กอัตโนมัตินี้สำหรับตัวระบุวัตถุฐานข้อมูลหรือไม่?

ทางเลือกของฉันคือการเขียนโค้ดที่ตรวจสอบคำสั่ง SQL แต่ละคำสั่งและใส่เครื่องหมายอัญประกาศคู่รอบตัวระบุทุกตัว (นั่นไม่ใช่คำหลัก)


คำหลัก สามารถใช้เป็นตัวระบุได้หากใส่เครื่องหมายอัญประกาศคู่ - แม้ว่าคุณไม่ควรทำเช่นนั้น ไม่ว่าในกรณีใดคุณไม่สามารถมั่นใจได้ว่าตัวระบุบางตัวจากฐานรหัส Sybase ของคุณไม่ใช่คำหลักใน PostgreSQL เหตุผลเพิ่มเติมทั้งหมดในการใช้ตัวระบุคำพูดซ้ำหรือเปลี่ยนชื่อเหล่านั้น
Erwin Brandstetter

ตัวระบุที่ไม่ได้ยกมาใน postgres นั้นจริง ๆ แล้วจะไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่จะถือว่าเป็นตัวพิมพ์เล็กทั้งหมด ดังนั้น tAbLeNaMe จะจับคู่กับตารางเดียวที่เรียกว่า tablename แต่ไม่ใช่หนึ่งชื่อ tableName ฉันจะเปลี่ยนชื่อตารางเพราะมิฉะนั้นคนจะลืม "และท้ายที่สุดการเข้าถึงรุ่นตัวพิมพ์เล็กโดยไม่ได้ตั้งใจ
JamesRyan

@JamesRyan: มันผิด select * from TaBlEnAmEจะอ้างอิงตารางเดียวกันกับselect * from tablenameหรือselect * from TABLENAME
a_horse_with_no_name

@a_horse_with_no_name: ถ้าคุณcreate table "tableName" (id integer primary key);แล้วcreate table "tablename" (id integer primary key);แบบสอบถามนี้select * from TaBlEnAmE;จะเลือกจาก "tablename" ไม่ใช่จาก "tableName" "ชื่อ unquoted พับเสมอที่จะเป็นตัวพิมพ์เล็ก"
Mike Sherrill 'Cat Recall'

คำตอบ:


3

ฉันสิ้นสุดการเขียนโค้ดที่แปลง SQL ที่สร้างโดยแอปพลิเคชันลงใน SQL ที่เข้ากันได้กับ PostgreSQL มันค่อนข้างตรงไปตรงมา:

  • แบ่งคำสั่งเป็นโทเค็นที่สมเหตุสมผลและข้ามตัวอักษรสตริงที่มีเครื่องหมายคำพูดเดี่ยว
  • อัญประกาศสิ่งที่ไม่ใช่คำหลักหรือตัวเลข

ฉันยังเอาประโยชน์ของชั้นนี้ที่จะเปลี่ยนการโทรไปเพื่อisnull coalesceจนถึงตอนนี้มันใช้งานได้ดี


ฉันใช้อัญประกาศ ("blahblablah") เพื่อให้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ .. มันทำงานได้อย่างราบรื่นสำหรับฉัน ..
Anuj Patel

1

มีวิธีการตั้งค่า PostgreSQL เพื่อปิดใช้งานตัวพิมพ์เล็กอัตโนมัตินี้สำหรับตัวระบุวัตถุฐานข้อมูลหรือไม่?

ไม่ได้โดยตรง คุณอาจจะสามารถที่จะทำให้การเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ที่จะซอร์สโค้ด PostgreSQLและคอมไพล์มัน (เริ่มใน src / backend / parser / parser.c?) แต่ฉันจะแปลกใจถ้ามันง่ายมาก


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