SQLite, sayısal sütunlara sayısal olmayan değerlerin eklenmesini kabul etmeden daha az yararlı olur mu?


10

SQLite'de aşağıdaki ifade başarılı olur ve dize SALARY, türdeki sütuna eklenir / güncellenir INTEGER:

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

Sıfırın eklenmeyeceğini / güncellenmeyeceğini, ancak asıl "ÇOK ÇOK" dizesini ekleyeceğinizi unutmayın, bu nedenle bu, otomatik tür dönüştürme ile ilgili değildir.

SSS:

Bu bir özellik , bir hata değil. SQLite dinamik yazmayı kullanır. Veri türü kısıtlamalarını zorunlu kılmaz. Herhangi bir türdeki veriler (genellikle) herhangi bir sütuna eklenebilir. Tamsayı sütunlara, boolean sütunlardaki kayan nokta sayılarına veya karakter sütunlarındaki tarihleri ​​rastgele uzunluklu dizeler koyabilirsiniz. CREATE TABLE komutunda bir sütuna atadığınız veri türü, bu sütuna hangi verilerin yerleştirilebileceğini kısıtlamaz. Her sütun keyfi bir uzunluk dizesi tutabilir. (Bunun bir istisnası vardır: INTEGER PRIMARY KEY türündeki sütunlar yalnızca 64 bit işaretli tamsayı içerebilir. INTEGER PRIMARY KEY sütununa tamsayı dışında bir şey koymaya çalışırsanız hata oluşur.)

Bu davranış açıkça kasıtlı, yine de neden SQLite'ın bu davranışa sahip olduğunu merak ediyorum , bildiğim diğer SQL veritabanlarının çoğu farklı şekilde davrandığından, sayısal olmayan bir dize eklemeye çalışırken bir hatayı yükseltir veya 0 dizesini dönüştürür sayısal bir sütun.

  • SQLite kitaplığı bu davranış olmadan daha az yararlı olur mu?

  • Bu, kütüphaneyi küçük ve hızlı tutmak için tasarımla mı yapıldı?

  • SQLite kitaplığı, sayısal bir sütuna bir dize eklemeyi denediğinde hataları artırmak için önemli ölçüde daha yavaş veya daha büyük olur mu?


9
Birisi bir keresinde "bir özellik pazarlama departmanı tarafından açıklandığı gibi bir hata" dedi.
Dan Pichelman

3
Performans ve veri yoğunluğu için iyi olduğundan şüphe ediyorum, ancak kod boyutu için yararlı olabilir. Sonuçta, bunu kasıtlı (veya en azından kabul edilmiş) bir yanlış özellik olarak adlandırırım.
Deduplicator

3
"... Genellikle gerçek zamanlı performans gerektiren gömülmüş sistem için kullanılan küçük boyutlu, düşük kaynaklar kütüphane kalabilmesi için bana dayatılmış bir sınırlama gibi görünüyor" Ben bir düşüşün daha fazla bir şey olması bir tür denetimi hayal edemiyorum herhangi bir miktarda disk GÇ gerçekleştiren işlemler için zaman / alan performans bölümü. Ayrıca, verilerin sabit bir boyuta sahip olacağını varsayamadıklarından, kodda ek kontroller yapmak zorundadırlar, bu nedenle dinamik yazım performansınıza mal olur.
Doval

1
@DocBrown Söylediğim için değil ama sui generis olduğu için .
Tulains Córdova

2
@ user61852 Soruyu tamamen yeniden yazmanızı ve SQLite'ın dinamik yazımının performans faydaları sağlayıp sağlamayacağına odaklanmanızı ve özellik / hata ayrımından veya X veya Y bağlamında dinamik yazmanın genel yararlılığından / yararsızlığından bahsetmeyi ihmal etmenizi öneririm.
Doval

Yanıtlar:


8

Hayır, dinamik yazım hem daha fazla depolama alanı hem de daha fazla işlem süresi gerektirir, özellikle de tür yakınlığı eklediklerinden, programlayıcının yoksayması serbest olan tercih edilen bir türe sahip olduğu anlamına gelir. Gerçek takas maliyetleri ile gerçekten kasıtlı bir özelliktir. Bu maliyetler, SQLite hedeflerinin kullanım durumları için etkili bir şekilde ihmal edilebilir, ancak hala oradalar.

Bu özelliklerin kullanışlılığını görmek zordur, çünkü bu özelliği size sunmaya alışkın değilsiniz. Eksikliği için geçici çözüm artık size daha doğal geliyor. Önceki deneyimleriniz nedeniyle, bunu asla başka bir şey olmayacak bir INTEGER alanı olarak düşünüyorsunuz , ancak SQLite bunu daha çok herhangi bir tür alan olarak görüyor, ancak büyük olasılıkla tamsayılar içerecektir. Belki de çoğunlukla ABD'de iş yapan, ancak bir avuç Kanada müşterisi olan bir şirket için bir posta kodu. Kullanıcının bir tamsayı benzeşimi belirtmesine izin vermek, onu her satırda bir dize yapmaktan çok fazla yer tasarrufu sağlar, ancak yine de size bu seçeneği sunar.


3
"ÇOK MUCH" dizesini sayısal bir sütuna başarıyla kaydetmeyle ilgili sorumun bir güncellemesini yazdım . Otomatik dönüşüm sıfır ekler. Ayrıca bu izin vereceğini bildiğim ilk ilişkisel veritabanı uygulamasıdır. MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL ve Sybase SQL Anywhere ile çalıştım.
Tulains Córdova

2
Yorumunu anlamıyorum. Cevabımla ilgili hiçbir şeyin otomatik dönüşümle ilgisi yoktu.
Karl Bielefeldt

1
SQLite onları veri türleri yerine depolama sınıfları olarak görür. sqlite.org/datatype3.html
JeffO

1
Açıkça yazılmış olma Upvoted ama olan sorunlar bu nedenleri göz ardı ederek veri doğruluğunu kanıtlayan. Bazı tam sayıları DB'nizden çıkaramaz ve tamsayı olacağını varsayamazsınız. ("Dinamik yazma", gerçek ilişkisel modelin kendisi ile çılgınca çelişkilidir .)
Wildcard

1
Yazmayı tamamen görmezden gelmenin maliyeti, küçük bir depolama alanı ve işlemci süresinden çok daha yüksektir.
DeadMG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.