Běžné problémy:
- 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.
- 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. - Citování je jiné, MySQL používá pro citování identifikátorů zpětné zaškrtnutí, zatímco PostgreSQL používá dvojité uvozovky.
- 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.