Kısa cevap
Veritabanı bir .xlsx dosyasını kendi başına okuyamaz. Bir şeyin sayfayı okuması, her sütunun türüne karar vermesi, tabloyu oluşturması ve satırları eklemesi gerekir. Bunu veritabanının içe aktarma sihirbazına bırakabilir, bir CSV'yi toplu yükleme komutuyla yükleyebilir ya da her istemcinin çalıştırabileceği düz SQL üretebilirsin.
Üretilen SQL en taşınabilir ve kontrolü en kolay yoldur; veritabanına dokunmadan önce neyin oluşturulacağını tam olarak görürsün. Aşağıdaki dönüştürücüde .xlsx ya da .csv dosyasını aç (ya da Excel'den kopyaladığın hücreleri yapıştır), Veritabanı'nı seç, Tablo adı'nı yaz ve betiği kopyala ya da indir. Sütun türleri veriden bulunur; barkodlar ve baştaki sıfırlı kodlar metin kalır.
Burada dene: Excel'den SQL'e
Aracın tam sayfasını açÖnce sayfayı hazırla
Başarısız aktarımların çoğu veritabanından değil Excel sayfasından kaynaklanır. Tablolar insanlar için hazırlanır; veritabanı ise tek, temiz bir veri dikdörtgeni ister. Aktarmadan önce iki dakikanı buna ayır:
- Tek bir başlık satırı ve her sütuna farklı bir ad. Tablonun üstündeki başlıkları, birleştirilmiş başlık hücrelerini ve ikinci başlık satırlarını kaldır.
- Her kayıt bir satır. Toplam ve ara toplam satırlarını, boş ayırıcı satırları ve verinin altındaki notları sil.
- Her sütunda tek tür değer. Fiyat sütununda bazı satırlarda sorunuz yazmasın; boş bırak, NULL olur.
- Veri içinde birleştirilmiş hücre olmasın. Birleştirmeyi kaldır ve değeri ilgili her satıra yaz.
- Formüller sorun değil: dosyada kayıtlı son hesaplanmış değer kullanılır. Son değişiklikten sonra çalışma kitabının hesaplanıp kaydedildiğinden emin ol.
- Her tablo kendi sayfasında olsun. Çalışma kitabında birden çok sayfa varsa dönüştürücü bir Sayfa seçici gösterir.
Yöntemlerin karşılaştırması
| Yöntem | Ne için uygun | Dikkat |
|---|---|---|
| Üretilen SQL (bu sayfa) | On binlerce satıra kadar, her veritabanı, okunabilir betik | Çok büyük dosya çok büyük betik demek |
| SQL Server Import and Export Wizard | SQL Server'a düzenli aktarım | .xlsx okumak için Microsoft Access Database Engine gerekir; 32 ve 64 bit sürümleri uyuşmalı |
| SSMS Import Flat File | CSV'yi SQL Server'a | Bitirmeden önce tahmin edilen türleri kontrol et |
| BULK INSERT (SQL Server), LOAD DATA (MySQL), COPY (PostgreSQL) | CSV'den milyonlarca satır | Sunucuda dosya erişim izni, ayraç ve kodlama ayarları |
| MySQL Workbench Table Data Import Wizard | CSV ya da JSON'u MySQL'e | Büyük dosyalarda yavaş |
| pgAdmin Import/Export | CSV'yi var olan PostgreSQL tablosuna | Tablo önceden oluşturulmalı |
| sqlite3 kabuğunun .import komutu (csv modu) | CSV'yi SQLite'a | Tablo yoksa sütunlar TEXT oluşturulur |
Üretilen SQL ile adım adım
- Dosyayı aç ya da hücreleri yapıştır. İlk satır sütun adı olur; verinde başlık yoksa İlk satır başlık seçeneğini kapat.
- Veritabanı'nı seç: SQL Server, MySQL, PostgreSQL ya da SQLite. Tırnaklama, türler ve kaçış kuralları buna göre değişir.
- Tablo adı'nı yaz. Adları sadeleştir açıkken Ürün Adı, urun_adi olur; sonraki her sorguda adları tırnaklama zahmetinden kurtarır.
- INSERT başına satır'ı seç. 100 güvenli bir başlangıç; büyük gruplar daha hızlı aktarılır. SQL Server tek VALUES listesinde en fazla 1000 satır kabul ettiği için araç SQL Server'da bunun üstüne çıkmaz.
- Ekleri belirle: CREATE TABLE tablo tanımını yazar, Önce tabloyu sil aynı adlı mevcut tabloyu siler (sadece değiştirmek istediğin tablolarda kullan), Transaction kullan ise aktarımı ya hep ya hiç yapar.
- SQL'i kopyala ya da .sql dosyasını indir, sonra veritabanı istemcinde çalıştır.
Dönüştürücünün seçtiği sütun türleri
Her sütun, içindeki tüm değerlere uyan en dar türü alır. Metin sütunlarının uzunluğu en uzun değerden yukarı yuvarlanır (örneğin en fazla 37 karakter için VARCHAR(50)); gerekirse sonradan genişletebilirsin.
| Sütundaki veri | SQL Server | MySQL | PostgreSQL | SQLite |
|---|---|---|---|---|
| Tam sayılar | INT ya da BIGINT | INT ya da BIGINT | INTEGER ya da BIGINT | INTEGER |
| Ondalıklı sayılar | DECIMAL(p, s) | DECIMAL(p, s) | NUMERIC(p, s) | REAL |
| true ya da false | BIT | TINYINT(1) | BOOLEAN | INTEGER |
| Tarih | DATE | DATE | DATE | TEXT |
| Tarih ve saat | DATETIME2 | DATETIME | TIMESTAMP | TEXT |
| Metin, baştaki sıfırlı kodlar | NVARCHAR(n) | VARCHAR(n) | VARCHAR(n) | TEXT |
Sık sorunlar ve çözümleri
- Tarihler 45000 gibi sayı olarak geliyor. Excel tarihleri gün sayısı olarak saklar (45000, 15 Mart 2023'tür). Dönüştürücü .xlsx okurken tarih hücrelerini gerçek tarihe çevirir; başka araçlarda sütunu önce tarih biçimine almak gerekebilir.
- Baştaki sıfırlar kayboluyor. Barkod, posta kodu ve 00123 gibi ürün kodları metin olmalı. Dönüştürücü değerleri sıfırla başlayan sütunu metin bırakır; 15 haneden uzun sayılar da metin kalır.
- SQL Server'da Türkçe harfler soru işaretine dönüyor. Unicode metin NVARCHAR sütun ve metinlerin başında N öneki ister; üretilen SQL Server betiği ikisini de kullanır. MySQL'de utf8mb4 tablo kullan.
- Virgüllü ondalık sayılar. Noktalı virgülle ayrılmış CSV'lerde 1.499,90 gibi değerler 1499.90 olarak okunur. Virgülle ayrılmış dosyalarda virgül sütun ayracıdır, bu tür değerler tırnak içinde olmalı.
- Boş hücreler. NULL olur ve sütun boş geçilebilir oluşturulur. Boş metin istiyorsan aktarımdan sonra değiştir.
- Metin içindeki tırnaklar. Kuzey'in gibi bir kesme işareti elle yazılmış INSERT'i bozar; üretilen değerlerde kaçış yapılır, MySQL için ters eğik çizgiler de kaçırılır.
Ne zaman toplu yükleme kullanmalı?
INSERT betikleri birkaç binden on binlerce satıra kadar idealdir: okunabilir, saklanabilir ve her yerde çalışır. Yüz binlerce ya da milyonlarca satırda betik çok büyür ve çalıştırması toplu yüklemeden yavaş olur.
Bu durumda sayfayı CSV UTF-8 olarak kaydet ve veritabanının toplu komutunu kullan: SQL Server'da BULK INSERT, MySQL'de LOAD DATA LOCAL INFILE, PostgreSQL'de COPY ya da psql'in \copy komutu. İşe yarayan bir ara yol: dönüştürücüye verinin bir örneğinden sadece CREATE TABLE komutunu yazdır, böylece mantıklı sütun türleri alırsın; sonra tam CSV'yi toplu komutla o tabloya yükle.