2009-07-29 37 views
11

Tôi có một dự án được viết bằng Django. Tất cả các lĩnh vực mà có nghĩa vụ phải lưu trữ một số chuỗi có nghĩa vụ phải được UTF-8, tuy nhiên, khi tôi chạyLàm thế nào để thiết lập mã hóa cho các cột char của bảng trong django?

manage.py syncdb 

tất cả các cột tương ứng được tạo ra với bộ ký tự cp1252 (đâu nó nhận được rằng - Tôi không có ý tưởng) và tôi phải cập nhật từng cột theo cách thủ công ...

Có cách nào để nói với Django để tạo tất cả các cột có mã hóa UTF-8 ở vị trí đầu tiên không?

BTW, tôi sử dụng MySQL.

Trả lời

18

Django không chỉ định bảng mã và đối chiếu trong câu hỏi CREATE TABLE. Mọi thứ được xác định bởi bộ ký tự cơ sở dữ liệu. Làm ALTER DATABASE ... CHARACTER SET utf8 COLLATE utf8_general_ci trước khi chạy syncdb sẽ giúp ích.

Để kết nối, vấn đề Django SET NAMES utf8 tự động, do đó bạn không cần phải lo lắng về cài đặt bộ ký tự kết nối mặc định.

+0

Nếu bạn tò mò, bạn có thể thấy 'TẠO TẠO 'Các chỉ số SQL bằng cách thực hiện' ./manage.py sqlall appname'. Tôi không có máy chủ MySQL ở gần, nhưng tôi chắc chắn sẽ không có bất kỳ bộ ký tự/đối chiếu nào được chỉ định. Vì vậy, collations sẽ được xác định từ các thiết lập cơ sở dữ liệu. – drdaeman

+1

Vâng, điều đó có vẻ như là lừa, cảm ơn bạn. Mã hóa cp1252 đó dường như là vấn đề của mysqladmin. –

4

Các chương trình phụ trợ cơ sở dữ liệu của Django tự động xử lý các chuỗi Unicode vào mã hóa thích hợp và trao đổi với cơ sở dữ liệu. Bạn không cần phải nói với Django những gì mã hóa cơ sở dữ liệu của bạn sử dụng. Nó xử lý nó tốt, bằng cách sử dụng mã hóa cơ sở dữ liệu của bạn.

Tôi không thấy bất kỳ cách nào bạn có thể nói với django để tạo cột, sử dụng một số mã hóa cụ thể. Như nó xuất hiện với tôi, có một số cấu hình MySQL trước đó hoàn toàn ảnh hưởng đến bạn. Và mặc dù đã thực hiện thủ công cho tất cả các cột, hãy sử dụng các cột này.

CREATE DATABASE db_name 
    [[DEFAULT] CHARACTER SET charset_name] 
    [[DEFAULT] COLLATE collation_name] 

ALTER DATABASE db_name 
    [[DEFAULT] CHARACTER SET charset_name] 
    [[DEFAULT] COLLATE collation_name] 
2

Mã hóa MySQL của bạn được đặt là gì?

Ví dụ, hãy thử những điều sau đây từ dòng lệnh:

mysqld --verbose --help | grep character-set 

Nếu nó không ra utf8, sau đó bạn sẽ cần phải thiết lập đầu ra trong my.cnf:

[mysqld] 
character-set-server=utf8 
default-collation=utf8_unicode_ci 

[client] 
default-character-set=utf8 

trang này có một số thông tin:

+0

Nếu tôi không nhầm, Django đã thực hiện 'SET NAMES utf8' trên kết nối. – drdaeman

+0

Nó nói latin1, vì vậy cp1252 là vấn đề của mysqladmin. Các cài đặt này bạn đề xuất dường như chỉ ảnh hưởng đến ứng dụng khách dòng lệnh –

+0

Không, phần [mysqld] dành riêng cho thời gian máy chủ. Tôi có collation mặc định trong tập tin của tôi, nhưng có lẽ đó là thay đổi trong phiên bản. Xem phần "Chỉ định cài đặt ký tự khi khởi động máy chủ" trên trang này: http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html – ars

Các vấn đề liên quan