Trước hết, câu trả lời của Daniel là lựa chọn chính xác và an toàn.
Đối với trường hợp cụ thể là thay đổi từ SQL_ASCII sang thứ gì đó khác, bạn có thể gian lận và chỉ cần chọc vào danh mục pg_database để gán lại mã hóa cơ sở dữ liệu. Điều này giả sử bạn đã lưu trữ bất kỳ ký tự không phải ASCII nào trong bảng mã dự kiến (hoặc đơn giản là bạn chưa sử dụng bất kỳ ký tự không phải ASCII nào).
Sau đó, bạn có thể làm:
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'
Điều này sẽ không thay đổi đối chiếu của cơ sở dữ liệu, chỉ là cách các byte mã hóa được chuyển đổi thành các ký tự (vì vậy bây giờ length('£123')
sẽ trả về 4 thay vì 5). Nếu cơ sở dữ liệu sử dụng đối chiếu 'C', sẽ không có thay đổi nào đối với thứ tự cho các chuỗi ASCII. Mặc dù vậy, bạn có thể sẽ cần tạo lại bất kỳ chỉ mục nào có chứa các ký tự không phải ASCII.
Emptor caveat. Kết xuất và tải lại cung cấp một cách để kiểm tra nội dung cơ sở dữ liệu của bạn có thực sự nằm trong bảng mã mà bạn mong đợi hay không. Và nếu hóa ra bạn có một số dữ liệu được mã hóa sai trong cơ sở dữ liệu, thì việc giải cứu sẽ rất khó khăn. Vì vậy, nếu bạn có thể, hãy kết xuất và bắt đầu lại.