|
<< İç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:
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_NUMBERi integer; i = ''; -- NOT_A_NUMBER
d double; d = ' '; -- NOT_A_NUMBER
tm time; tm = ''; -- CONVERT_ERRORBoş 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).
'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.
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ırCHAR(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).
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ğer | TIMESTAMP 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:00Kesirli 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').
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.