Общие проблемы:
- Поведение GROUP BY. PostgreSQL имеет довольно строгий GROUP BY. Если вы используете предложение GROUP BY, то каждый столбец в вашем SELECT должен либо появляться в вашем GROUP BY, либо использоваться в статистической функции.
- Усечение данных. MySQL будет тихо урезать длинную строку, чтобы она поместилась внутри столбца
char(n)
, если только ваш сервер не находится в строгом режиме, PostgreSQL будет жаловаться и заставит вас урезать свою строку самостоятельно.
- Цитирование отличается, MySQL использует обратные кавычки для цитирования идентификаторов, тогда как PostgreSQL использует двойные кавычки.
- LIKE нечувствителен к регистру в MySQL, но не в PostgreSQL. Это заставляет многих пользователей MySQL использовать LIKE в качестве оператора равенства строк без учета регистра.
(1) будет проблемой, если вы используете метод AR group
в любом из ваших запросов или GROUP BY в любом необработанном SQL. Выполните поиск для column "X" must appear in the GROUP BY clause or be used in an aggregate function
, и вы увидите несколько примеров и общих решений.
(2) будет проблемой, если вы будете использовать строковые столбцы в любом месте вашего приложения, и ваши модели неправильно проверяют длину всех значений входящей строки. Обратите внимание, что при создании строкового столбца в Rails без указания предела фактически создается столбец varchar(255)
, поэтому на самом деле существует неявный :limit => 255
, даже если вы его не указали. Альтернативой является использование t.text
для ваших строк вместо t.string
; это позволит вам работать с произвольно большими строками без штрафа (по крайней мере, для PostgreSQL). Как отмечает Эрвин ниже (и каждый второй шанс, который он получает), varchar(n)
- это анахронизм в мире PostgreSQL.
(3) не должно быть проблемой, если в вашем коде нет необработанного SQL.
(4) будет проблемой, если вы используете LIKE в любом месте вашего приложения. Вы можете исправить это, изменив a like b
на lower(a) like lower(b)
(или upper(a) like upper(b)
, если хотите кричать) или a ilike b
, но учтите, что ILIKE в PostgreSQL нестандартен.
Существуют и другие различия, которые могут вызвать проблемы, но они кажутся наиболее распространенными.
Вам нужно пересмотреть несколько вещей, чтобы чувствовать себя в безопасности:
group
звонки.
- Необработанный SQL (включая любые фрагменты при вызовах
where
).
- Проверка длины строки в ваших моделях.
- Все виды использования LIKE.