MySQL Decimal, Double, Float Rounding Problem

When importing CSV with decimal values to MySQL, the numbers are rounded. I have searched on google but didn’t find a solution so I have come up with my own.

In CSV file decimal part is seperated with a comma “,” , however MySQL accepts a dot “.”.
So just replace commas with dots in your CSV file. That easy 😉


sed -i 's/,/./g' your_file.csv

MySQL CSV Import

Üzerinde çeşitli analizler yapabilmek için son 10 yıllık EUR/USD paritesinin 1 dakikalık verilerini MySQL veritabanına aktarmam gerekti. Siz de veritabanı düzenine sahip herhangi bir CSV dosyasını komut satırını kullanarak aşağıdaki gibi içe aktarabilirsinz.


mysql -u username -p dbname --local-infile


load data local infile 'eurusd.csv'
into table eurusd fields terminated by ','
enclosed by '"' lines terminated by '\n'
(id, date, time, value)

Elinizdeki CSV formatına göre “fields terminated by” ve “enclosed by” parametrelerini değiştirmeyi unutmayın. “terminated by” hücreleri hangi karakterin ayırdığını, “enclosed by” ise hücrelerin hangi karakter ile sarıldığını ifade ediyor. Örnek olarak;


terminated by ',' ve
enclosed by '"'
ise
"Hucre 1","Hucre 2"

“lines terminated by” ifadesi de satır sonunu ifade ediyor. Windows veya Mac bilgisyarda hazırlanan CSV lerin farklı satır bitişleri olabilir.

Mysql Veri Tiplerinde Length Parametresi

MySql veri tipleri hakkındaki bir yanlışımı az önce öğrendim ve bir çok kişinin de bu konuyu yanlış bildiğini düşünüyorum.

Bildiğiniz gibi char, varchar, tinyint, int, bigint gibi veri tiplerinin hepsi length (size veya uzunluk olarak da geçer) parametresi alır. char ve varchar tipleri için bu değeri tanımladığınız zaman, tanımlanan değer kadar karakter saklanır. Örnek olarak varchar(3) olarak tanımlarsak saklanan değerler aşağıdaki gibi olabilir;

  • abc
  • tef
  • ağa

Doğal olarak int(3) değeri için de saklanacak değerin -999 ve 999 arasında olabileceği aklımıza geliyor. Halbuki int(3)’ün sakladığı değer (4 byte) değişmiyor. Değişen tek şey verinin gösterim uzunluğu oluyor. Yani kayıt ettiğiniz int değeri veritabanında yine 4 byte kaplarken yalnızca sayının 3 hanesi gösteriliyor.

Peki o zaman uzunluk tanımlamanın ne faydası var. Eğer uzun tanımlarsanız; sayısal tipler için tanımlanan uzunluk değeri, zerofill (sıfırla doldur) özelliği ile birlikte kullanıldığında aşağıdaki gibi getirilir. (Aşağıdaki örnek int(4) için verilmiştir.)

  • 0005
  • 0004
  • 0011

Kaynaklar:
http://dev.mysql.com/doc/refman/5.0/en/numeric-type-attributes.html
http://dev.mysql.com/doc/refman/5.0/en/integer-types.html

MySql Connection Refused 111 Çözümü

Farkli istemcilerin ve sunucuların iletişim halinde olduğu bir projemi geliştirirken 3 farklı bilgisayardan oluşan bir test ortamı hazırladım. MySql Server bu bilgisayarlardan birisinde kuruluydu ve bu veritabanına diğer bir bilgisayarın erişim sağlaması gerekiyordu. İlk defa standart kurulumda 111 hatası aldım ve kısa bir arama sonucuna config dosyasında bulunan bir satırın güvenlik sağlamak amacıyla MySql bağlantısına sadece yerel ağ da izin vermesinin buna sebep olduğunu buldum.

Sorunu gidermek için /etc/mysql/my.cnf dosyasını açıp “bind-address = 127.0.0.1” satırını silmeniz gerekiyor veya güvenlikten ödün vermemek için bağlantı yapacak bilgisyarların ip adreslerini de tanımlayabilirsiniz.

Config dosyasındaki değişiklikten sonra her zamanki gibi “sudo service mysql restart” 🙂

Veritabanlarından Rasgele Satır Çekmek

Bütün veritabanlarında temel sorgu mantığı aynı olmasına rağmen her veritabanını kendine özgü fonksiyonları ve fonksiyon isimleri olabiliyor. MSSql, MySql derken PostgreSql de uzun süredir tecrübe ettiğim bir veritabanı haline geldi. Bugün bir farklılığını daha keşfettim. Rasgele sonuç çekmek için kullanılan fonksiyon MySql deki RAND() fonksiyon yerine RANDOM() fonksiyonuymuş. Sonuç olarak bu 3 veritabanından aşağıdaki gibi rasgele sonuç çekebilirsiniz.

MSSql

SELECT column FROM table ORDER BY NEWID()

MySql

SELECT column FROM table ORDER BY RAND()

PostgreSql

SELECT column FROM table ORDER BY RANDOM()