Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

beralih dari MySQL ke PostgreSQL untuk Ruby on Rails demi Heroku

Masalah umum:

  1. 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.
  2. 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.
  3. Mengutip berbeda, MySQL menggunakan backticks untuk mengutip pengenal sedangkan PostgreSQL menggunakan tanda kutip ganda.
  4. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Cara Menggunakan Pernyataan KASUS di MySQL?

  2. Bagaimana cara menghapus semua catatan duplikat dalam tabel MySQL tanpa tabel temp

  3. Apakah mysqldump menangani data biner dengan andal?

  4. Bagaimana mysql mendefinisikan DISTINCT() dalam dokumentasi referensi

  5. mysql mendapatkan nama kolom tabel dalam urutan abjad