2012-05-01 38 views
5

Tôi đang cố gắng lưu nhận xét từ ứng dụng iPhone có thể và ngày nay rất có thể là sẽ bao gồm biểu tượng cảm xúc. Không có vấn đề gì tôi làm, tôi không thể lưu các biểu tượng cảm xúc vào cơ sở dữ liệu MySQL ... Lỗi Unicode liên tục.Biểu tượng cảm xúc từ iPhone sang Python/Django

  • Python 2.6.5
  • Django 1.2.1
  • cơ sở dữ liệu MySQL (thiết lập để bộ ký tự utf8 cho các bảng và các hàng)
  • Cứu dữ liệu đến một VARCHAR (255) lĩnh vực

Lỗi mà tôi tiếp tục nhận được là:

Incorrect string value: '\xF0\x9F\x97\xBC \xF0...' for column 'body' at row 1 

strin g tôi đi vào cơ sở dữ liệu là:

test_txt = u"Emoji - \U0001f5fc \U0001f60c \U0001f47b ...".encode('utf-8') 

Cập nhật: Đây là mô hình tôi đang sử dụng:

class ItemComment(db.Model): 
    item = db.ForeignKey(Item) 
    user = db.ForeignKey(Profile) 
    body = db.CharField(max_length=255, blank=True, null=True) 

    active = db.BooleanField(default=True) 
    date_added = db.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
    return "%s" % (self.item) 

Điều kỳ lạ là, nếu tôi cố gắng và chuyển thông tin này đến một lĩnh vực mà tôi đã tạo ra trong MySQL và không phải Django models.py nó hoạt động tốt. Nhưng ngay sau khi tôi đăng ký các lĩnh vực trong mô hình Django nó chết. Có cách nào khác để lưu trữ những điều này?

Mọi ý tưởng sẽ thật tuyệt vời.
tôi không thể gặp khó khăn hơn về vấn đề này ...

Cập nhật 2: Theo dõi nó trong Terminal sử dụng câu lệnh sau CẬP NHẬT (chú ý U0001f5fc)

UPDATE 'table' SET 'body' = '', WHERE 'table'.'id' = 1 ; args=(u'\U0001f5fc') 

Sử dụng như Hardcore như tôi có thể nhận được để vượt qua giá trị:

force_unicode(smart_str(value), encoding='utf-8', strings_only=False, errors='ignore') 

Nhưng lỗi vẫn ném:

_mysql_exceptions.Warning: Incorrect string value: '\xF0\x9F\x97\xBC' for column 'body' at row 1 

Hoàn toàn mất!

Chúc mừng,

+0

Có thể bạn cung cấp mô hình của bạn? – bossylobster

+0

@ bossylobster, chúc mừng, vừa thêm mô hình vào bản sao ở trên. –

+0

Kiểm tra http://stackoverflow.com/questions/2108824/mysql-incorrect-string-value-error-when-save-unicode-string-in-django, vì bạn nói nó hoạt động tốt trong MySQL Tôi nghi ngờ điều này sẽ hy vọng , nhưng nó đáng để thử. – bossylobster

Trả lời

5

Thay đổi charset utf8mb4 cho máy chủ MySQL (phiên bản 5.5.3 sau)

Trong my.ini (my.cnf)

[mysqld] 
character_set_server = utf8mb4 
collation-server = utf8mb4_unicode_ci 

hoặc SQL query

SET NAMES 'utf8mb4'; 

thấy cũng http://dev.mysql.com/doc/refman/5.5/en/charset-connection.html

hoặc xóa ký tự để thực hiện.

python

import re 
# emoji_text is unicode 
no_emoji_text = re.sub('[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]', '', str(emoji_text)) 

Cảm ơn bạn.

Xem thêm MySQL throws Incorrect string value error

+0

Đây cũng là giải pháp tôi đã sử dụng. Nếu điều đó có thể giúp tôi viết một bài báo mà tôi đã cố gắng giải thích các vấn đề tôi có, đó là tương tự: http://pjambet.github.io/blog/emojis-and-mysql/ – pjam

0

tôi sử dụng Django 1.11 và sau setting.py và tạo sql có thể lưu trữ biểu tượng cảm xúc tốt,

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'db_name', 
     'USER': 'db_user', 
     'PASSWORD': 'your_password', 
     'OPTIONS': {'charset': 'utf8mb4'}, # note here!!! 
    } 
} 

Các sql đến từ this câu trả lời,

CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 
Các vấn đề liên quan