Masalah umum:
- GROUP BY perilaku. PostgreSQL memiliki GROUP BY yang agak ketat. Jika Anda menggunakan klausa GROUP BY, maka setiap kolom di SELECT Anda harus muncul di GROUP BY atau digunakan dalam fungsi agregat.
- Pemotongan data. MySQL diam-diam akan memotong string panjang agar muat di dalam
char(n)
kolom kecuali server Anda dalam mode ketat, PostgreSQL akan mengeluh dan membuat Anda memotong string Anda sendiri. - Mengutip berbeda, MySQL menggunakan backticks untuk mengutip pengenal sedangkan PostgreSQL menggunakan tanda kutip ganda.
- LIKE tidak peka huruf besar/kecil di MySQL tetapi tidak di PostgreSQL. Hal ini menyebabkan banyak pengguna MySQL menggunakan LIKE sebagai operator persamaan string yang tidak peka huruf besar/kecil.
(1) akan menjadi masalah jika Anda menggunakan group
AR metode di salah satu kueri Anda atau GROUP BY dalam SQL mentah apa pun. Lakukan pencarian untuk column "X" must appear in the GROUP BY clause or be used in an aggregate function
dan Anda akan melihat beberapa contoh dan solusi umum.
(2) akan menjadi masalah jika Anda menggunakan kolom string di mana saja di aplikasi Anda dan model Anda tidak memvalidasi panjang semua dengan benar nilai string yang masuk. Perhatikan bahwa membuat kolom string di Rails tanpa menentukan batas sebenarnya membuat varchar(255)
kolom jadi sebenarnya ada :limit => 255
implicit implisit meskipun Anda tidak menentukannya. Alternatifnya adalah menggunakan t.text
untuk string Anda alih-alih t.string
; ini akan memungkinkan Anda bekerja dengan string besar yang sewenang-wenang tanpa penalti (setidaknya untuk PostgreSQL). Seperti yang dicatat Erwin di bawah (dan setiap kesempatan lain yang dia dapatkan), varchar(n)
adalah sedikit anakronisme di dunia PostgreSQL.
(3) seharusnya tidak menjadi masalah kecuali Anda memiliki SQL mentah dalam kode Anda.
(4) akan menjadi masalah jika Anda menggunakan LIKE di mana saja di aplikasi Anda. Anda dapat memperbaikinya dengan mengubah a like b
ke lower(a) like lower(b)
(atau upper(a) like upper(b)
jika Anda ingin berteriak) atau a ilike b
tetapi perlu diketahui bahwa ILIKE PostgreSQL
tidak standar.
Ada perbedaan lain yang dapat menyebabkan masalah, tetapi tampaknya itu adalah masalah yang paling umum.
Anda harus meninjau beberapa hal agar merasa aman:
group
panggilan.- SQL mentah (termasuk cuplikan apa pun di
where
panggilan). - Validasi panjang string dalam model Anda.
- Semua penggunaan LIKE.