Các vấn đề chung:
- NHÓM THEO hành vi. PostgreSQL có một GROUP BY khá nghiêm ngặt. Nếu bạn sử dụng mệnh đề GROUP BY, thì mọi cột trong phần CHỌN của bạn phải xuất hiện trong GROUP BY của bạn hoặc được sử dụng trong một hàm tổng hợp.
- Cắt bớt dữ liệu. MySQL sẽ lặng lẽ cắt bớt một chuỗi dài để vừa với bên trong một
char(n)
trừ khi máy chủ của bạn ở chế độ nghiêm ngặt, PostgreSQL sẽ phàn nàn và bắt bạn phải tự cắt bớt chuỗi của mình. - Việc trích dẫn thì khác, MySQL sử dụng dấu ngoặc kép để trích dẫn số nhận dạng trong khi PostgreSQL sử dụng dấu ngoặc kép.
- LIKE không phân biệt chữ hoa chữ thường trong MySQL nhưng không phân biệt chữ hoa chữ thường trong PostgreSQL. Điều này khiến nhiều người dùng MySQL sử dụng LIKE như một toán tử bình đẳng chuỗi không phân biệt chữ hoa chữ thường.
(1) sẽ là một vấn đề nếu bạn sử dụng group
của AR trong bất kỳ truy vấn nào của bạn hoặc GROUP BY trong bất kỳ SQL thô nào. Một số tìm kiếm cho column "X" must appear in the GROUP BY clause or be used in an aggregate function
và bạn sẽ thấy một số ví dụ và giải pháp phổ biến.
(2) sẽ là một vấn đề nếu bạn sử dụng cột chuỗi ở bất kỳ đâu trong ứng dụng của mình và các mô hình của bạn không xác thực đúng độ dài của tất cả giá trị chuỗi đến. Lưu ý rằng việc tạo một cột chuỗi trong Rails mà không chỉ định giới hạn sẽ thực sự tạo ra một varchar(255)
vì vậy thực sự có một :limit => 255
ngầm định mặc dù bạn không chỉ định một. Một giải pháp thay thế là sử dụng t.text
cho các chuỗi của bạn thay vì t.string
; điều này sẽ cho phép bạn làm việc với các chuỗi lớn tùy ý mà không bị phạt (ít nhất là đối với PostgreSQL). Như Erwin lưu ý bên dưới (và mọi cơ hội khác mà anh ấy có được), varchar(n)
là một chút lạc hậu trong thế giới PostgreSQL.
(3) sẽ không thành vấn đề trừ khi bạn có SQL thô trong mã của mình.
(4) sẽ là một vấn đề nếu bạn đang sử dụng LIKE ở bất kỳ đâu trong ứng dụng của mình. Bạn có thể sửa lỗi này bằng cách thay đổi a like b
thành lower(a) like lower(b)
(hoặc upper(a) like upper(b)
nếu bạn thích hét lên) hoặc a ilike b
nhưng hãy lưu ý rằng ILIKE của PostgreSQL
không phải là tiêu chuẩn.
Có những khác biệt khác có thể gây ra rắc rối nhưng đó có vẻ là những vấn đề phổ biến nhất.
Bạn sẽ phải xem xét một số điều để cảm thấy an toàn:
-
group
cuộc gọi. - SQL thô (bao gồm bất kỳ đoạn mã nào trong
where
cuộc gọi). - Xác thực độ dài chuỗi trong mô hình của bạn.
- Tất cả các cách sử dụng LIKE.