2012-09-08 42 views
7

Tôi đang sử dụng gói cơ sở dữ liệu cơ bản tại Heroku. Điều này chạy trên Postgres 9.1 có hỗ trợ cho các ngôn ngữ. Tôi đang gặp vấn đề với việc sắp xếp trong ứng dụng của mình vì các ký tự ÅÄÖ không được xử lý đúng cách (như ở Thụy Điển).Đặt ngôn ngữ trên Heroku postgres

Cài đặt để đặt là LC_COLLATE, xử lý thứ tự chuỗi. Vấn đề là tôi không thể tìm thấy bất kỳ cách nào để thiết lập điều này trên Heroku. Các cơ sở dữ liệu được tạo ra có được lc_collate=en_US.UTF-8, nhưng tôi cần phải đặt nó thành sv_SE.UTF-8.

Không thể thay đổi cài đặt LC_COLLATE này khi cơ sở dữ liệu đã được tạo, do đó tôi không thể thay đổi nó thông qua bảng điều khiển psql.

Vì vậy, làm cách nào tôi có thể đặt cài đặt này?

Trả lời

6

Bạn chính xác không thể thay đổi đối chiếu mặc định của cơ sở dữ liệu; LC_COLLATE là một biến môi trường được đặt trên các máy chủ cơ sở dữ liệu Heroku, nằm ngoài tầm kiểm soát của bạn và đã được đặt trước khi cơ sở dữ liệu của bạn được tạo. Tuy nhiên, bạn có thể đặt đối chiếu mặc định cho các cột riêng lẻ:

CREATE TABLE new_table (
    foo varchar COLLATE "sv_SE.UTF-8", 
    bar varchar COLLATE "sv_SE.UTF-8" 
); 

ALTER TABLE existing_table ALTER COLUMN baz TYPE varchar COLLATE "sv_SE.UTF-8"; 

Để biết thêm, hãy xem 22.2. Collation Support trong hướng dẫn sử dụng PostgreSQL.

Bạn có thể hoặc không cần phải CREATE COLLATION trước tiên. Ngoài ra, tất cả điều này phụ thuộc vào các máy chủ cơ sở dữ liệu Heroku có cài đặt dữ liệu miền địa phương thích hợp - mặc dù nếu không, bạn có thể yêu cầu được triển khai, vì nó sẽ không làm tổn thương bất cứ ai.

Nếu không, bạn có thể chạy các phiên bản PostgreSQL của riêng bạn trong EC2, với bất kỳ thiết lập tùy chỉnh nào bạn muốn. Điều đó sẽ yêu cầu thời gian quản trị đầu tư, nhưng thực sự chạy 9.1 khá đơn giản, thậm chí kể cả việc nhân bản trực tuyến. Thậm chí có thể rẻ hơn. Nhược điểm đó là giữ cho cơ sở dữ liệu chạy trở thành vấn đề của bạn thay vì một vấn đề cho đội Ops Heroku.

+0

Wow, đó là thực sự gây phiền nhiễu. PostgreSQL hỗ trợ thiết lập collations cho mỗi cơ sở dữ liệu thông qua 'CREATE DATABASE ... LC_CTYPE 'blah' LC_COLLATE 'blah''; nó hút rằng Heroku không phơi bày điều đó với người dùng. –

+0

Cảm ơn bạn, có vẻ như nó hoạt động để thay đổi đối chiếu cột. Tôi đã phải tạo ra collation đầu tiên mặc dù. Cảm ơn. – Linus

+1

Cảm ơn! Cuối cùng. Tôi đã đấu tranh với điều này quá lâu. Đối với tôi, nó không hoạt động với "sv-SE.UTF-8" nhưng chỉ "sv-SE". Sử dụng đường ray, tôi đã thực hiện một nhiệm vụ cào để thay đổi collation với đoạn mã sau: ---- namespace: thiết lập làm nhiệm vụ : heroku_collation =>: môi trường làm ActiveRecord :: Base.establish_connection ActiveRecord :: Base. connection.execute 'ALTER TABLE municipalities ALTER COLUMN tên TYPE varchar COLLATE "sv_SE";' kết thúc kết thúc –

0

tôi giải quyết điều này bằng cách tạo ra một sự chuyển đổi làm thay đổi collation của các cột có liên quan (như willglyn gợi ý):

class SetSwedishCollationForStores < ActiveRecord::Migration 
    def up 
    execute 'ALTER TABLE stores ALTER COLUMN city TYPE varchar COLLATE "sv_SE";' 
    execute 'ALTER TABLE stores ALTER COLUMN title TYPE varchar COLLATE "sv_SE";' 
    end 
end 
Các vấn đề liên quan