SQLite จะมีประโยชน์น้อยลงหรือไม่หากไม่ยอมรับการแทรกค่าที่ไม่ใช่ตัวเลขลงในคอลัมน์ตัวเลข


10

ใน SQLite คำสั่งต่อไปนี้จะประสบความสำเร็จและสตริงจะถูกแทรก / ปรับปรุงลงในSALARYคอลัมน์ซึ่งเป็นประเภทINTEGER:

update employee set salary='TOO MUCH' where emp_id=1;

โปรดทราบว่าศูนย์จะไม่ถูกแทรก / อัปเดต แต่เป็นสตริง"TOO MUCH" ที่แท้จริงดังนั้นนี่จึงไม่เกี่ยวกับการแปลงประเภทอัตโนมัติ

สถานะคำถามที่พบบ่อย:

นี่คือคุณสมบัติไม่ใช่ข้อผิดพลาด SQLite ใช้การพิมพ์แบบไดนามิก มันไม่บังคับใช้ข้อ จำกัด ชนิดข้อมูล สามารถแทรกข้อมูลประเภทใดก็ได้ (โดยปกติ) ลงในคอลัมน์ใดก็ได้ คุณสามารถใส่สตริงความยาวโดยพลการลงในคอลัมน์จำนวนเต็มจำนวนจุดลอยตัวในคอลัมน์บูลีนหรือวันที่ในคอลัมน์อักขระ ประเภทข้อมูลที่คุณกำหนดให้กับคอลัมน์ในคำสั่ง CREATE TABLE ไม่ได้ จำกัด ข้อมูลที่สามารถใส่ลงในคอลัมน์นั้นได้ ทุกคอลัมน์สามารถเก็บสตริงความยาวได้ตามใจชอบ (มีข้อยกเว้นหนึ่งประการ: คอลัมน์ประเภท INTEGER Primary KEY อาจเก็บไว้เป็นจำนวนเต็มแบบ 64 บิตเท่านั้นข้อผิดพลาดจะเกิดขึ้นหากคุณพยายามใส่สิ่งอื่นที่ไม่ใช่จำนวนเต็มลงในคอลัมน์ INTEGER Primary KEY)

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

  • ไลบรารี SQLite จะมีประโยชน์น้อยลงหรือไม่หากไม่มีพฤติกรรมนี้

  • สิ่งนี้ทำโดยการออกแบบเพื่อให้ห้องสมุดมีขนาดเล็กและรวดเร็วหรือไม่?

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


9
มีคนเคยกล่าวว่า "คุณสมบัติเป็นข้อบกพร่องตามที่อธิบายโดยฝ่ายการตลาด"
Dan Pichelman

3
ฉันสงสัยว่ามันดีสำหรับประสิทธิภาพและความหนาแน่นของข้อมูลถึงแม้ว่ามันอาจเป็นประโยชน์กับขนาดของโค้ด โดยรวมแล้วฉันจะเรียกมันว่าเป็นความผิดพลาดที่ตั้งใจ
Deduplicator

3
"ดูเหมือนว่าฉันมีข้อ จำกัด ที่กำหนดไว้เพื่อให้ยังคงเป็นห้องสมุดขนาดเล็กและทรัพยากรต่ำโดยปกติจะใช้สำหรับระบบฝังที่ต้องการประสิทธิภาพแบบเรียลไทม์ ... "ฉันไม่สามารถจินตนาการการตรวจสอบประเภทเป็นอะไรมากกว่าการหล่น ที่ฝากข้อมูลประสิทธิภาพของเวลา / พื้นที่สำหรับการดำเนินการที่ทำดิสก์ IO จำนวนเท่าใดก็ได้ นอกจากนี้พวกเขาจะต้องมีการตรวจสอบเพิ่มเติมในรหัสเพราะพวกเขาไม่สามารถคาดเดาได้ว่าข้อมูลจะมีขนาดคงที่ดังนั้นเนื้อหาการพิมพ์แบบไดนามิกจึงมีค่าใช้จ่ายที่คุณต้องใช้
Doval

1
@DocBrown ไม่ทำให้ฉันพูดอย่างนั้น แต่เพราะมันเป็นgeneris หมี่
Tulains Córdova

2
@ user61852 ฉันขอแนะนำให้คุณเขียนคำถามใหม่อย่างสมบูรณ์และเน้นว่าการพิมพ์แบบไดนามิกของ SQLite จะให้ประโยชน์ด้านประสิทธิภาพหรือไม่และไม่กล่าวถึงคุณลักษณะ / ข้อแตกต่างหรือประโยชน์ทั่วไป / ไร้ประโยชน์ของการพิมพ์แบบไดนามิกในบริบท X หรือ Y
Doval

คำตอบ:


8

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

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


3
ฉันเขียนการอัปเดตคำถามของฉันเกี่ยวกับการจัดเก็บสตริง"TOO MUCH"ให้เป็นตัวเลขที่เป็นตัวเลข การแปลงอัตโนมัติจะแทรกศูนย์ นอกจากนี้ยังเป็นการใช้ฐานข้อมูลเชิงสัมพันธ์เป็นครั้งแรกที่ฉันรู้ว่าจะอนุญาต ฉันทำงานกับ MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL และ Sybase SQL ทุกที่
Tulains Córdova

2
ฉันไม่เข้าใจความคิดเห็นของคุณ ไม่มีอะไรเกี่ยวกับคำตอบของฉันเกี่ยวกับการแปลงอัตโนมัติ
Karl Bielefeldt

1
SQLite พิจารณาคลาสหน่วยเก็บข้อมูลแทนประเภทข้อมูล sqlite.org/datatype3.html
JeffO

1
upvoted สำหรับถูกเขียนไว้อย่างชัดเจน แต่คุณจะไม่สนใจปัญหาสาเหตุนี้ในความถูกต้องของข้อมูลที่พิสูจน์ คุณไม่สามารถดึงจำนวนเต็มออกจากฐานข้อมูลของคุณและคิดว่ามันจะเป็นจำนวนเต็ม ( "แบบไดนามิกพิมพ์" เป็นลำพองที่ขัดแย้งกับรูปแบบความสัมพันธ์ที่เกิดขึ้นจริงของตัวเอง .)
Wildcard

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