Delphi Can
Oracle'da 1 Byte'lık Veri Türü - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Veri Tabanı (https://www.delphican.com/forumdisplay.php?fid=4)
+--- Forum: Diğer Veri Tabanları (https://www.delphican.com/forumdisplay.php?fid=18)
+--- Konu Başlığı: Oracle'da 1 Byte'lık Veri Türü (/showthread.php?tid=4042)

Sayfalar: 1 2 3


Oracle'da 1 Byte'lık Veri Türü - sadettinpolat - 09-10-2019

X veritabanında boolean veri tipinin olmaması bunun mantıklı olduğu ya da turbo pascal zamanından kalma alışkanlıklarla kod yazıldığı manasına gelmez.

Belkide boolean/tiny int veri tipi koymak istiyorlar ama geriye uyumluluk , performans, mevcut mimari ya da farklı nedenlerden dolayı bu tür veri tiplerini ekleyemiyorlar /eklemenin olumsuz yönlerinin daha çok olacağını düşünüyorlardır. Eklememe nedenlerini bilmeden neyin iyi neyin kötü olduğu konusunda kesin bir fikir beyan edemeyiz.

char veri tipi pascal zamanlarından kalan bir veri tipi diyebiliriz. DB2 sistemde db admin kolonlara tanımladığımız varchar veri tiplerinin tümünü istisnasız olarak char veri tipine çevirirdi.
varcharda uzunluk katarın başına yazılıyormuş ve veritabanı kaç karakter okuması gerektiğini bu baştaki değere bakıp sonra okuma yaptığı için daha fazla cpu harcaması nedeniyle varchar tipini kesinlikle kullanmamıza izin vermiyordu. char tipi varsın sabit diskte daha fazla yer kaplasın , sonuç itibari ile sabit diskler cpulardan çok çok ucuz aygıtlar diyordu.


Cvp: Oracle'da 1 Byte'lık Veri Türü - sddk - 09-10-2019

1 byte'lık veri tipi ANSI SQL'de yok.
Kullanacağım veri tabanı sunucusunda olsa iyi olur ama olmaması da sorun değil.
@Tuğrul HELVACI, Microsoft SQL Server'daki DATALENGTH'in Oracle karşılığı LENGTHB olsa gerek.


Cvp: Oracle'da 1 Byte'lık Veri Türü - Tuğrul HELVACI - 09-10-2019

(08-10-2019, Saat: 13:21)delphim Adlı Kullanıcıdan Alıntı:
(08-10-2019, Saat: 09:28)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Yanıtınız için teşekkür ederim; ama Oracle, programcıları bilmemne ile ilgilenmek zorunda bırakmaz; .Net başka bir şeyle ilgilenmek zorunda bırakmaz ! Ee, bu programcılar ne iş yapacaklar ? Gerçek programcıların işi zaten bu tarz şeylerle ilgilenmek.

Bir Database Admin nasıl olur da bit/byte lar ile ilgilenmez. Bu husus veritabanı programlamanın önemli kısımlarından birisidir. Oracle, Number(3) veri türü ile basamak bazlı yer tahsisatı yapacak. Yani 0 ila 999 aralığındaki veriyi tutabilmek için minimum 2 byte yer ayıracak. Oysaki 1 byte'ın alabileceği değer aralığı bana yetecekti. Kafadan 1 byte zarar.

Bu kısıtlamanın bir başka mantıklı nedeni olmalı. Eğer yok ise; bu son derece aptalca bir şey.

Nerede abidik, gubidik saçma şeyler var; son 2 senedir hepsi üstüme üstüme koşuyor Smile

Öncelikle ben sizinle polemik olsun diye cevap yazmadım Tuğrul Bey. Oracle'da temel veri tipleri NUMBER, VARCHAR2 (& CHAR), DATE dir. CLOB, BLOB, RAW, LONG ek bazı veri tipleri de vardır. Performas gibi özel durumlar için ise istisnai BINARY_FLOAT and BINARY_DOUBLE sayısal veritipleri de var. 1 BYTE veri tutacaksanız ya CHAR ya da RAW veri tipini kullanacaksınız, bunlarda sayısal veri tipleri değil.

SQLLite vs kullanıyor olsanız anlarım da eğer Oracle veritabanı kullanıyorsanız ve 1-2 Byte'ın hesabını yaparak programlama yapıyorsanız ortada ciddi bir sorun var demektir.

Turbo Pascal zamanlarının veri tutma ve işleme teknolojileri ile düşünerek 2020 yılında program yazamayız. Diyorsanız ki Oracle'ın yaklaşımı saçmalık, oturursunuz kendi veritabanı yönetim sisteminizi yazar, Oracle ve benzeri ürünlerdeki saçmalıklardan da kaçabilirsiniz.

Aynı programın EXE boyutu her yeni delphi sürümünde bir miktar artıyor. Aynı işi yapan aynı görsellikde aynı koddan derlenmiş program Delphi 5'de 5 MB ise Delphi 10.3 de 11 MB olabiliyor. Delphi 10.3 gibi saçmalıkları kullanmasın kimse mi diyelim. Delphi 2 candır, gerisi byte israfıdır mı diyelim.

Sizin yazınıza polemikle yanıt vermedim ki ben; siz neden öyle anladınız onu da anlamadım. Öncelikle, yine verdiğiniz kayda değer bilgilere teşekkür edeyim. Lâkin; Oracle veritabanı kullanıyorsam neden 1-2 byte'a dikkat etmemeliyim, bunu bir izah edin de biz de anlayalım öncelikle. 1-2 byte'a dikkat ediyorsak ne gibi bir ciddi sorun var sizin görüşünüze göre ortada ?

Ayrıca, hayırdır siz Oracle'da mı çalışıyorsunuz ? Nedir bu alınganlığın nedeni ? Oracle gibi bir veritabanı bir byte'a sığabilecek sayısal veriler için bir veri türü imkanı sunmuyorsa; 1 byte'a sığabilecek verileri 3 byte'ta tutuyorsa; bunun adı saçmalıktır ! başka ne olacak. Bana kalırsa siz biraz daha veritabanı programlama ile haşır neşir olun. Benim ya da benim gibi düşünenlerin yeni bir RDBMS yazmasına lüzum yok; zaten yazılmışı var: Microsoft Sql Server.

Siz ve sizin gibi düşünenlerin tasarladığı veritabanlarını kullanacaklara şimdiden rabbim sabır versin.

Madde madde cevap vermeyi de lüzumlu görmüyorum; çünkü elmalar ile armutları kıyaslıyorsunuz; ve tezgaha bakıp hepsi meyve diyorsunuz. Mantıklı ve seviyeli bir tartışma içinde olursanız ona göre devam edebilirim bende.

Maksat üzüm yemekse eyvallah, bağcı dövmeye kalkarsanız; yanıtınızı alırsınız.


Cvp: Oracle'da 1 Byte'lık Veri Türü - Tuğrul HELVACI - 09-10-2019

(08-10-2019, Saat: 17:05)delphim Adlı Kullanıcıdan Alıntı:
(08-10-2019, Saat: 16:33)ahmet_sinav Adlı Kullanıcıdan Alıntı: @delphim Milyonlarca satır row insert ediliyor bu byte hesabını yapmak durumundayız.
Proje geliştirirken sayısal alanlara int deyip geçmem mesela smallint se smallint tir.
Proje ve database büyüdükçe bu ufak ufak byte'lar performansı etkilemeye başlıyor sonra ne yapsakta
performans arttırırız data boytunu düşürürüz diye uğraşıyoruz.
Proje küçük bir proje ise bile bunlara alışkanlık babında dikkat etmekte fayda var.

1 byte sayısal veri tipi Oracle, DB2, Postgre SQL de yok. MSSQL ve MySQL'de var. Düşündüm ve size hak verdim. İkna oldum ki Oracle, DB2, Postgre SQL çok kötü veritabanı yönetim sistemleri. Herkes MS SQL veya MySQL kullanmalı. Oracle, DB2, Postgre SQL'den uzak durmalı, özellikle de Oracle'dan.

Doğru yolu bulmuşsunuz o halde. Hayırlı olsun.
(Alaylı cevabınıza istinaden)


Cvp: Oracle'da 1 Byte'lık Veri Türü - Tuğrul HELVACI - 09-10-2019

(09-10-2019, Saat: 09:26)sddk Adlı Kullanıcıdan Alıntı: 1 byte'lık veri tipi ANSI SQL'de yok.
Kullanacağım veri tabanı sunucusunda olsa iyi olur ama olmaması da sorun değil.
@Tuğrul HELVACI, Microsoft SQL Server'daki DATALENGTH'in Oracle karşılığı LENGTHB olsa gerek.

Ansi SQL bir standartlar kümesidir. Adı üstünde standart bunlar, yani çok geniş bir hacimde olmazlar. Tüm RDBMS'ler bu kümeyi desteklerler ancak kendileri de kümeye yeni özellikler eklerler. Dolayısı ile RDBMS'lerin kendi dilleri, Ansi SQL'den çok daha geniş özellikler ile donatılmıştır.

 Benim sorum/eleştirim (nasıl kabul ederseniz); Oracle'da 1 byte'lık veri türünün olup olmaması üzerine idi dikkat ederseniz; Ansi Sql'de var mı diye sormadım.

1 byte'lık sayısal veri türünün olmamasını sorun olarak kabul etmiyorsunuz, peki aşağıdaki senaryoda ne yapacaksınız:

Personel tablosuna Yaş alanı ekleyeceğiz. Bir canlının yaşı sıfır'dan başlar ve pozitif anlamda belirli bir limite kadar artar. İnsanlar için 0..255 aralığı bu veri türü için yeterli olur. Bu nedenle Microsoft Sql Server'da tinyint isimli bir alan var. Ya da Pascal'da byte türlü alan var. Örnekler çoğaltılabilir.

Şimdi bu durumda; veri tabanı bize varchar(1) türünde bir imkan sağlıyorsa onu kullanabiliriz diye düşünüyor olabilirsiniz. Ancak varchar(1) veri türü 1 byte'lık alan kaplamasına karşın; içerisine sayı olmayan değerler de alabilir ve 9 yaş'dan daha büyük değerleri içinde tutamam.Varchar(3) olarak tanımlasam alabileceği değerler anlamında yeterli olur(Karadeniz de 100 yaşın üzerinde yaşayan insanlarımız var) ancak bu sefer'de içine ABC string türündeki verisi yazılabilir ve uzunluk 3 byte olur.

Ben yaş alanını bu tarz bir veritabanında nasıl tutacağım peki ?

Sorun değil demişsiniz ya ondan yazmak istedim.

LENGTHB için ise teşekkür ederim, hemen deneyeceğim.


Cvp: Oracle'da 1 Byte'lık Veri Türü - Tuğrul HELVACI - 09-10-2019

LengthB fonksiyonunu deneme imkanı buldum.

Deneme isimli NUMBER(3) biçiminde tanımlanmış değişkenin içinde;

4 değeri olduğunda dbms_output.Put_line(LENGTHB(Deneme));  1 çıktısını veriyor.
44 değeri olduğunda dbms_output.Put_line(LENGTHB(Deneme));  2 çıktısını veriyor.
444 değeri olduğunda dbms_output.Put_line(LENGTHB(Deneme));  3 çıktısını veriyor.

Yani istediğim bu değil.


Oracle'da 1 Byte'lık Veri Türü - sddk - 09-10-2019

(09-10-2019, Saat: 10:03)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: LengthB fonksiyonunu deneme imkanı buldum.

Deneme isimli NUMBER(3) biçiminde tanımlanmış değişkenin içinde;

4 değeri olduğunda dbms_output.Put_line(LENGTHB(Deneme));  1 çıktısını veriyor.
44 değeri olduğunda dbms_output.Put_line(LENGTHB(Deneme));  2 çıktısını veriyor.
444 değeri olduğunda dbms_output.Put_line(LENGTHB(Deneme));  3 çıktısını veriyor.

Yani istediğim bu değil.

Ön not: Oracle tecrübem çok çok az, yanılıyor olabilirim.

*Char ve binary alanlar için verdiğim fonksiyon aslında aynı işi yapıyor, aşağıdaki 1. linkte bir anlatım var. Ancak sayısal veriler üzerinde bu iki fonksiyonu karşılaştırmak çok mantıklı görünmüyor zira Oracle'da numeric alanın boyu içinde saklanan data ile alakalı, 2. verdiğim linkte "Oracle Database stores numeric data in variable-length format" diyor.

LENGTH - Get String Length - Oracle to SQL Server Migration -> http://www.sqlines.com/oracle/functions/length
https://docs.oracle.com/cd/E11882_01/server.112/e40540/tablecls.htm#CNCPT313

Ne için SQL Server üzerinde DATALENGTH fonksiyonunu sayısal alanlarda kullanma ihtiyacınız olmuştu? Yanılmıyorsam SQL Server'da sayısal (hem tam sayı, hem ondalıklı) alanlar sabit uzunluklu.

(09-10-2019, Saat: 09:41)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı:
(09-10-2019, Saat: 09:26)sddk Adlı Kullanıcıdan Alıntı: 1 byte'lık veri tipi ANSI SQL'de yok.
Kullanacağım veri tabanı sunucusunda olsa iyi olur ama olmaması da sorun değil.
@Tuğrul HELVACI, Microsoft SQL Server'daki DATALENGTH'in Oracle karşılığı LENGTHB olsa gerek.

Ansi SQL bir standartlar kümesidir. Adı üstünde standart bunlar, yani çok geniş bir hacimde olmazlar. Tüm RDBMS'ler bu kümeyi desteklerler ancak kendileri de kümeye yeni özellikler eklerler. Dolayısı ile RDBMS'lerin kendi dilleri, Ansi SQL'den çok daha geniş özellikler ile donatılmıştır.

 Benim sorum/eleştirim (nasıl kabul ederseniz); Oracle'da 1 byte'lık veri türünün olup olmaması üzerine idi dikkat ederseniz; Ansi Sql'de var mı diye sormadım.

1 byte'lık sayısal veri türünün olmamasını sorun olarak kabul etmiyorsunuz, peki aşağıdaki senaryoda ne yapacaksınız:

Personel tablosuna Yaş alanı ekleyeceğiz. Bir canlının yaşı sıfır'dan başlar ve pozitif anlamda belirli bir limite kadar artar. İnsanlar için 0..255 aralığı bu veri türü için yeterli olur. Bu nedenle Microsoft Sql Server'da tinyint isimli bir alan var. Ya da Pascal'da byte türlü alan var. Örnekler çoğaltılabilir.

Şimdi bu durumda; veri tabanı bize varchar(1) türünde bir imkan sağlıyorsa onu kullanabiliriz diye düşünüyor olabilirsiniz. Ancak varchar(1) veri türü 1 byte'lık alan kaplamasına karşın; içerisine sayı olmayan değerler de alabilir ve 9 yaş'dan daha büyük değerleri içinde tutamam.Varchar(3) olarak tanımlasam alabileceği değerler anlamında yeterli olur(Karadeniz de 100 yaşın üzerinde yaşayan insanlarımız var) ancak bu sefer'de içine ABC string türündeki verisi yazılabilir ve uzunluk 3 byte olur.

Ben yaş alanını bu tarz bir veritabanında nasıl tutacağım peki ?

Sorun değil demişsiniz ya ondan yazmak istedim.

LENGTHB için ise teşekkür ederim, hemen deneyeceğim.

Aslında bu alanın olmamasının "muhtemel" sebebini söylemeye çalışmıştım ama haklısınız, Ansi SQL'de olup olmadığını sormamışsınız!
Byte tipi sıkça kullandığım bir alan, dolayısı ile olursa onu kullanırım yoksa kullandığım veri tabanı sisteminin en uygun veri tipini kullanırım. Bir sebepten (performans/güvenilirlik vs) Oracle seçmişsem (veya onu kullanmam istenilmiş ise) onun en uygun veri tiplerini kullanmak benim için sorun değil.


Cvp: Oracle'da 1 Byte'lık Veri Türü - Tuğrul HELVACI - 09-10-2019

(09-10-2019, Saat: 11:52)sddk Adlı Kullanıcıdan Alıntı:
(09-10-2019, Saat: 10:03)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: LengthB fonksiyonunu deneme imkanı buldum.

Deneme isimli NUMBER(3) biçiminde tanımlanmış değişkenin içinde;

4 değeri olduğunda dbms_output.Put_line(LENGTHB(Deneme));  1 çıktısını veriyor.
44 değeri olduğunda dbms_output.Put_line(LENGTHB(Deneme));  2 çıktısını veriyor.
444 değeri olduğunda dbms_output.Put_line(LENGTHB(Deneme));  3 çıktısını veriyor.

Yani istediğim bu değil.

Ön not: Oracle tecrübem çok çok az, yanılıyor olabilirim.

*Char ve binary alanlar için verdiğim fonksiyon aslında aynı işi yapıyor, aşağıdaki 1. linkte bir anlatım var. Ancak sayısal veriler üzerinde bu iki fonksiyonu karşılaştırmak çok mantıklı görünmüyor zira Oracle'da numeric alanın boyu içinde saklanan data ile alakalı, 2. verdiğim linkte "Oracle Database stores numeric data in variable-length format" diyor.

LENGTH - Get String Length - Oracle to SQL Server Migration -> http://www.sqlines.com/oracle/functions/length
https://docs.oracle.com/cd/E11882_01/server.112/e40540/tablecls.htm#CNCPT313

Ne için SQL Server üzerinde DATALENGTH fonksiyonunu sayısal alanlarda kullanma ihtiyacınız olmuştu? Yanılmıyorsam SQL Server'da sayısal (hem tam sayı, hem ondalıklı) alanlar sabit uzunluklu.

(09-10-2019, Saat: 09:41)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Ansi SQL bir standartlar kümesidir. Adı üstünde standart bunlar, yani çok geniş bir hacimde olmazlar. Tüm RDBMS'ler bu kümeyi desteklerler ancak kendileri de kümeye yeni özellikler eklerler. Dolayısı ile RDBMS'lerin kendi dilleri, Ansi SQL'den çok daha geniş özellikler ile donatılmıştır.

 Benim sorum/eleştirim (nasıl kabul ederseniz); Oracle'da 1 byte'lık veri türünün olup olmaması üzerine idi dikkat ederseniz; Ansi Sql'de var mı diye sormadım.

1 byte'lık sayısal veri türünün olmamasını sorun olarak kabul etmiyorsunuz, peki aşağıdaki senaryoda ne yapacaksınız:

Personel tablosuna Yaş alanı ekleyeceğiz. Bir canlının yaşı sıfır'dan başlar ve pozitif anlamda belirli bir limite kadar artar. İnsanlar için 0..255 aralığı bu veri türü için yeterli olur. Bu nedenle Microsoft Sql Server'da tinyint isimli bir alan var. Ya da Pascal'da byte türlü alan var. Örnekler çoğaltılabilir.

Şimdi bu durumda; veri tabanı bize varchar(1) türünde bir imkan sağlıyorsa onu kullanabiliriz diye düşünüyor olabilirsiniz. Ancak varchar(1) veri türü 1 byte'lık alan kaplamasına karşın; içerisine sayı olmayan değerler de alabilir ve 9 yaş'dan daha büyük değerleri içinde tutamam.Varchar(3) olarak tanımlasam alabileceği değerler anlamında yeterli olur(Karadeniz de 100 yaşın üzerinde yaşayan insanlarımız var) ancak bu sefer'de içine ABC string türündeki verisi yazılabilir ve uzunluk 3 byte olur.

Ben yaş alanını bu tarz bir veritabanında nasıl tutacağım peki ?

Sorun değil demişsiniz ya ondan yazmak istedim.

LENGTHB için ise teşekkür ederim, hemen deneyeceğim.

Aslında bu alanın olmamasının "muhtemel" sebebini söylemeye çalışmıştım ama haklısınız, Ansi SQL'de olup olmadığını sormamışsınız!
Byte tipi sıkça kullandığım bir alan, dolayısı ile olursa onu kullanırım yoksa kullandığım veri tabanı sisteminin en uygun veri tipini kullanırım. Bir sebepten (performans/güvenilirlik vs) Oracle seçmişsem (veya onu kullanmam istenilmiş ise) onun en uygun  veri tiplerini kullanmak benim için sorun değil.

Merhaba, benim de okuduğum benzer istikamette. Oracle sayısal verileri varchar veri tutar gibi tutuyor. DataLength fonksiyonunu aramamın nedeni aslında basit. Hafızada kaplayacağı alanın boyutunu teyid etmek. Kısaca Delphi'deki SizeOf 'u arıyorum. Ancak; anlaşılan o da yok :-(


Oracle'da 1 Byte'lık Veri Türü - delphim - 09-10-2019

Bir konuda yanlış anlaşılmalar ya da hatalı varsayımlar mevcut. Length, Lengthb ya da parametresi VARCHAR olan başka fonksiyonlara 4444 gibi sayısal değerler geçtiğinizde size 4444 için değil '4444' için hesaplama yapar. Bu Oracle'ın sayısal verileri karakter olarak tutmasından değil otomatik tip değişimi yapmasından kaynaklanır.

Oracle sayısal alana kakakter, karakter alana sayısal değer atamaya izin verir. Gerekiyorsa ve mümkünse otomatik tip dönüşümünü yapar ve kodu çalıştırır. Tip dönüşümü mümkün değilse de ilgili hata mesajı ile çalışmayı sonlandırır.

Diğer konuya gelince Oracle'da çalışmıyorum. İşim gereği Oracle'da başka veritabanları da kullanıyorum. Tüm veritabanlarının benzer konulara farklı yaklaşımları, farklı ele alışları mevcut. Tüm programlama dillerinin benzer konulara farklı yaklaşımları, farklı ele alışları mevcut olduğu gibi. Bir veritabanına çok alışık olup da diğerinde olmayan yada farklı ele alınan şeyler için saçmalık demek en basitinden sığ bir yaklaşım. Hiçbirini (Oracle, DB2, MSSQL, ..., Delphi, Java, C/C++, C#, Go, ...) zorla kullanmıyoruz. Şimdi C/C++'da bolean veri türü yok ne saçma bir dil diyemyiz. Zorla kullanıyorsak da olanı olduğu şekilde kullanacağız, ya da kullanmayacağız.


Cvp: Oracle'da 1 Byte'lık Veri Türü - yozdemir - 09-10-2019

Hiç Oracle ile çalışmadım ama şöyle birşey buldum, sanırım  NUMBER(0)  1 byte yer kullanıyor.

---------------------------------------------------------------------------------------------------------------
https://stackoverflow.com/questions/24240087/oracle-numberp-storage-size


You can see the actual storage used with vsize or dump.

create table t42 (n number(10));

insert into t42 values (0);
insert into t42 values (1);
insert into t42 values (-1);
insert into t42 values (100);
insert into t42 values (999);
insert into t42 values (65535);
insert into t42 values (1234567890);

select n, vsize(n), dump(n) from t42 order by n;

                 N   VSIZE(N)                     DUMP(N)
---------------   ---------     -----------------------------
                -1            3    Typ=2 Len=3: 62,100,102
                0             1              Typ=2 Len=1: 128
                1             2            Typ=2 Len=2: 193,2
            100             2            Typ=2 Len=2: 194,2
            999             3       Typ=2 Len=3: 194,10,100
          65535           4      Typ=2 Len=4: 195,7,56,36
1234567890          6  Typ=2 Len=6: 197,13,35,57,79,91

Notice that the storage varies depending on the value,
even though they are all in a number(10) column,
and that two 3-digit numbers can need different
amounts of storage.