2014-10-23 21 views
5

Làm cách nào để mã hóa một thứ gì đó bằng ut8mb4 bằng Python?Cách mã hóa (utf8mb4) bằng Python

Tôi có hai bộ dữ liệu: dữ liệu Tôi đang di chuyển sang cơ sở dữ liệu MySQL mới của mình từ Parse và dữ liệu đi tiếp (chỉ nói đến cơ sở dữ liệu mới của tôi). Cơ sở dữ liệu của tôi là utf8mb4 để lưu trữ biểu tượng cảm xúc và các chữ cái có dấu.

Tập đầu tiên của dữ liệu chỉ xuất hiện một cách chính xác (khi biểu tượng cảm xúc và điểm nhấn được tham gia) khi tôi có trong kịch bản python của tôi:

MySQLdb.escape_string(unicode(xstr(data.get('message'))).encode('utf-8')) 

và khi đọc từ cơ sở dữ liệu MySQL trong PHP:

$row["message"] = utf8_encode($row["message"]); 

Tập dữ liệu thứ hai chỉ hiển thị chính xác (khi có biểu tượng cảm xúc và dấu trọng âm) khi tôi KHÔNG bao gồm phần utf8_encode($row["message"]). Tôi đang cố gắng điều chỉnh những thứ này để cả hai bộ dữ liệu được trả lại chính xác cho ứng dụng iOS của tôi. Hãy giúp tôi!

+1

Tôi đoán bạn đang nói về MySQL ? Nếu vậy thì utf8 của Python sẽ giống hệt với utf8mb4 của MySQL. Bạn có thể cụ thể hơn về những gì bạn đang làm và kết quả bạn thấy không? –

+0

Có vẻ như utf8mb4 là một cái gì đó MySQL phát minh bởi vì thực hiện ut8 của họ chỉ hoạt động với các ký tự BMP. Đây không phải là trường hợp cho utf8 bình thường, có thể mã hóa bất kỳ ký tự unicode nào. Đó là mã hóa mà Python đang sử dụng. Có lẽ MySQL cung cấp một tập hợp các chức năng để làm việc với mã hóa tùy chỉnh của họ? – Cameron

+0

@MarkRansom đã thêm nhiều câu hỏi cụ thể hơn – user3781236

Trả lời

9

MySQL utf8mb4 encodingchỉ tiêu chuẩn UTF-8.

Tuy nhiên, họ phải thêm tên đó để phân biệt với tên broken UTF-8 character set chỉ hỗ trợ các ký tự BMP.

Nói cách khác, bạn phải luôn mã hóa UTF-8 khi nói chuyện với MySQL, nhưng phải tính đến cơ sở dữ liệu không thể xử lý các điểm mã Unicode ngoài U + FFFF, trừ khi bạn sử dụng utf8mb4ở phía MySQL.

15

Tôi đã vật lộn với sự trao đổi chính xác đầy đủ các ký tự UTF-8 giữa Python và MySQL vì lợi ích của Biểu tượng cảm xúc và các ký tự khác ngoài điểm mã U + FFFF.

Để chắc chắn rằng tất cả mọi thứ đã làm việc tốt, tôi phải làm như sau:

  1. đảm bảo utf8mb4 được sử dụng cho CHAR, VARCHAR, và TEXT cột trong MySQL
  2. thực thi UTF-8 bằng Python
  3. thi hành UTF-8 để được sử dụng giữa Python và MySQL

Để thi hành UTF-8 bằng Python, hãy thêm dòng sau đây e như dòng đầu tiên hoặc thứ hai của kịch bản Python của bạn:

# -*- coding: utf-8 -*- 

Để thực thi UTF-8 giữa Python và MySQL, thiết lập kết nối MySQL như sau:

# Connect to mysql. 
dbc = MySQLdb.connect(host='###', user='###', passwd='###', db='###', use_unicode=True) 

# Create a cursor. 
cursor = dbc.cursor() 

# Enforce UTF-8 for the connection. 
cursor.execute('SET NAMES utf8mb4') 
cursor.execute("SET CHARACTER SET utf8mb4") 
cursor.execute("SET character_set_connection=utf8mb4") 

# Do database stuff. 

# Commit data. 
dbc.commit() 

# Close cursor and connection. 
cursor.close() 
dbc.close() 

Bằng cách này, bạn không cần để sử dụng các chức năng như encodeutf8_encode.

+2

Danh sách kiểm tra rất hữu ích. Cứu tôi khỏi bị hấp. –

+0

Điều này khắc phục sự cố tôi gặp phải với mysql + python + emojis –

+0

Dòng 'coding' áp dụng * chỉ cho cách Python giải mã chuỗi ký tự chuỗi trong mã nguồn *. Không phải cách mã hóa và giải mã * dữ liệu * được xử lý. Trừ khi bạn đã sử dụng các ký tự không phải ASCII trong chuỗi ký tự chuỗi, không cần thiết lập điều này. –

0

use_unicode=True không hoạt động đối với tôi.

Giải pháp của tôi

  • trong mysql, thay đổi toàn bộ cơ sở dữ liệu, bảng và các lĩnh vực mã hóa để utf8mb4
  • MySQLdb.connect(host='###' [...], charset='utf8'
  • dbCursor.execute('SET NAMES utf8mb4')
  • dbCursor.execute("SET CHARACTER SET utf8mb4")
Các vấn đề liên quan