4.4 Karakter değerden dönüşüm kuralları

<< İçindekileri Görüntülemek İçin Tıklayın >>

Yer:  Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 4. Tip uyumluluğu ve dönüşümler >

4.4 Karakter değerden dönüşüm kuralları

Karakter bir değerin sayıya ya da tarihe dönüşmesi en sık kullanılan ve en çok yanılgı üreten yoldur. Kurallar şunlardır:

4.4.1 Değerin çevresindeki boşluklar yok sayılır

i integer;
i = '  42  ';     -- 42. İki taraftaki boşluk da yok sayılır (SQL:2011 6.13).

Yalnızca boşluk karakteri böyledir. Sekme boşluk sayılmaz ve değeri geçerli bir sabit olmaktan çıkarır:

i = c'\t42';    -- NOT_A_NUMBER

4.4.2 Boş ya da tamamen boşluk olan değer geçerli bir sabit değildir

i integer;  i = '';       -- NOT_A_NUMBER
d double;   d = '   ';    -- NOT_A_NUMBER
tm time;    tm = '';      -- CONVERT_ERROR
Not

Boş bir dizginin 0 olarak okunması pratikte veri bozan bir davranıştır: boş bir form alanı ya da boş bir CSV hücresi hataya değil gerçek bir değere dönüşür. Bu yüzden reddedilir. Sıfır isteniyorsa açıkça yazılır (coalesce(nullif(s,''), '0') gibi).

4.4.3 Onaltılık görünümlü dizgi sayı değildir

'0x10' ya da 'xyz' gibi değerler NOT_A_NUMBER verir. SQL'in tam sayı sabiti yalnızca ondalık basamaklardan oluşur; onaltılık bir değer x'...' biçiminde ikili sabit olarak yazılır, sayı olarak değil.

4.4.4 Sondaki boşluklar sığdırmak için düşürülebilir

s5 varchar(5);
s5 = 'ab  ';        -- 'ab  ' : sığıyor, boşluklar KORUNUR
s5 = 'abcde     ';  -- 'abcde' : sığmıyor, sondaki boşluklar düşürülür
s5 = 'abcdefghij';  -- STRING_OVERFLOW : boşluk olmayan karakter kaybı hatadır
Not

CHAR(n) boşlukla doldurulur (SQL:2011): c5 char(5); c5 = 'ab'; sonucunda değer 'ab   'tir ve char_length(c5) 5 verir. Karşılaştırma PAD SPACE yapar: iki tarafın kuyruk boşlukları atılıp karşılaştırılır, yani c5 = 'ab' doğrudur. İki VARCHAR'ın karşılaştırması NO PAD kalır (standart bu karakteristiği uygulamaya bırakır; PostgreSQL de bpchar PAD / text NO PAD yapar).

GROUP BY ve DISTINCT uzunluğa bakar: karşılaştırma operatörleri, IN/ANY/ALL/BETWEEN ve indeks aramaları (PRIMARY KEY, UNIQUE, ikincil indeks) PAD SPACE uygular; gruplama ve DISTINCT ise değerleri olduğu gibi karşılaştırır. Aynı kolonun değerleri kendi aralarında tutarlıdır (hepsi n karaktere dolguludur), ama farklı genişlikte iki CHAR kolonunu ya da CHAR ile VARCHAR'ı gruplamak bilinen bir sınırdır (char(3) 'ab' ile char(5) 'ab' iki ayrı grup olur).

4.4.5 Tarih ve saat biçimleri

Karakter bir değer tarih/saat olarak okunurken öndeğer biçim yyyy-MM-dd HH:mm:ss+TZ'dir. Değer, biçimin sondaki isteğe bağlı zaman alanlarını vermeyebilir; ama ayrıştırılamayan bir artık kalırsa değer reddedilir.

DeğerTIMESTAMP olarak sonuç
'2026-08-27 21:05:58'27/08/2026 21:05:58
'2026-08-27 21:05'27/08/2026 21:05:00; saniye verilmemiş
'2026-08-27'27/08/2026 00:00:00; saat verilmemiş
'2026-08-27 21:05:58+03'27/08/2026 21:05:58+03:00
'2026-08-27 21:05:58+03:30'27/08/2026 21:05:58+03:30
'2026-08-27T21:05:58'27/08/2026 21:05:58; ISO 8601'in T ayırıcısı kabul edilir
'2026-08-27 21:05:58 xyz'CONVERT_ERROR; artık metin
'2026-08-27 21:05:58.123'27/08/2026 21:05:58.123; kesir isteğe bağlıdır

Bir saat değeri kendi başına da okunabilir; bu durumda tarih alanı istenmez:

tm time;
tm = '10:20:30';     -- 10:20:30
tm = '10:20';        -- 10:20:00
tm = '10:20:30+03';  -- 10:20:30+03:00
Not

Kesirli saniye ('…21:05:58.123') standardın sabit biçiminin isteğe bağlı bir parçasıdır ve okunur: hem öndeğer ayrıştırmada, hem CAST'te, hem de sabit yazımında (time '10:20:30.75').

İki ayrı yazdırma biçimi

Bir tarih/saat değerinin gösterimi ile CAST'in ürettiği metin aynı şey değildir ve olmamaları gerekir:

Console.PrintF(c'{0}', ts)              -- 27/08/2026 21:05:58   (yerel gösterim)
cast(ts as varchar(40))                 -- 2026-08-27 21:05:58   (sabit biçimi)

CAST'in sabit biçimini üretmesi zorunludur: giriş tarafı o biçimi kabul eder, böylece motor kendi bastığı metni geri okuyabilir (cast(cast(date '2020-01-15' as varchar(40)) as date)). Bir değerin ekranda nasıl görüneceği ise istemcinin işidir ve yerel biçimde kalır; Console.PrintF ve günlük satırları dâhil. Saat dilimi ve kesir yalnızca değerde varsa yazılır; olmayan bir ofset uydurulmaz.