sql >> Databáze >  >> RDS >> Mysql

přechod z MySQL na PostgreSQL pro Ruby on Rails kvůli Heroku

Běžné problémy:

  1. Chování GROUP BY. PostgreSQL má poměrně striktní GROUP BY. Pokud použijete klauzuli GROUP BY, musí se každý sloupec ve vašem SELECT buď objevit ve vaší GROUP BY, nebo být použit v agregační funkci.
  2. Zkrácení dat. MySQL tiše zkrátí dlouhý řetězec, aby se vešel do char(n) Pokud váš server není v přísném režimu, PostgreSQL si bude stěžovat a přiměje vás, abyste si svůj řetězec zkrátili sami.
  3. Citování je jiné, MySQL používá pro citování identifikátorů zpětné zaškrtnutí, zatímco PostgreSQL používá dvojité uvozovky.
  4. LIKE nerozlišuje malá a velká písmena v MySQL, ale ne v PostgreSQL. To vede mnoho uživatelů MySQL k používání LIKE jako operátoru rovnosti řetězců bez ohledu na velikost písmen.

(1) bude problém, pokud použijete group AR metoda v kterémkoli z vašich dotazů nebo GROUP BY v jakémkoli surovém SQL. Proveďte nějaké hledání column "X" must appear in the GROUP BY clause or be used in an aggregate function a uvidíte několik příkladů a běžných řešení.

(2) bude problém, pokud kdekoli v aplikaci používáte sloupce řetězců a vaše modely správně neověřují délku všech hodnoty příchozích řetězců. Všimněte si, že vytvoření sloupce řetězce v Rails bez zadání limitu ve skutečnosti vytvoří varchar(255) takže ve skutečnosti existuje implicitní :limit => 255 i když jste žádné nespecifikovali. Alternativou je použití t.text pro vaše řetězce namísto t.string; to vám umožní pracovat s libovolně velkými řetězci bez penalizace (alespoň pro PostgreSQL). Jak Erwin poznamenává níže (a při každé další příležitosti, kterou dostane), varchar(n) je ve světě PostgreSQL trochu anachronismus.

(3) by neměl být problém, pokud nemáte v kódu nezpracované SQL.

(4) bude problém, pokud kdekoli v aplikaci používáte LIKE. Tento problém můžete opravit změnou a like b na lower(a) like lower(b) (nebo upper(a) like upper(b) pokud chcete křičet) nebo a like b ale mějte na paměti, že ILIKE PostgreSQL je nestandardní.

Existují další rozdíly, které mohou způsobit potíže, ale ty se zdají být nejběžnější.

Abyste se cítili bezpečně, budete si muset projít několik věcí:

  • group hovory.
  • Raw SQL (včetně všech úryvků v where hovory).
  • Ověření délky řetězce ve vašich modelech.
  • Všechna použití LIKE.


  1. Jak zkontrolovat databázi Oracle pro dlouho běžící dotazy

  2. Nerozumím Collation? (Mysql, RDBMS, znakové sady)

  3. Nelze se připojit k místnímu serveru MySQL přes soket '/tmp/mysql.sock

  4. Výchozí název databáze MySQL