Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để lưu trữ văn bản tiếng Ả Rập trong cơ sở dữ liệu mysql bằng cách sử dụng python?

Để làm rõ một vài điều, vì nó cũng sẽ giúp ích cho bạn trong tương lai.

txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'

Đây không phải là một chuỗi Ả Rập. Đây là một đối tượng unicode , với mã điểm unicode. Nếu bạn chỉ cần in nó và nếu thiết bị đầu cuối của bạn hỗ trợ tiếng Ả Rập, bạn sẽ nhận được đầu ra như thế này:

>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)

Bây giờ, để có được đầu ra tương tự như Arabic (الطيران) trong cơ sở dữ liệu của mình, bạn cần mã hóa chuỗi.

Mã hóa là lấy các điểm mã này; và chuyển đổi chúng thành byte để máy tính biết phải làm gì với chúng.

Vì vậy, kiểu mã hóa phổ biến nhất là utf-8 , bởi vì nó hỗ trợ tất cả các ký tự của tiếng Anh, cộng với rất nhiều ngôn ngữ khác (bao gồm cả tiếng Ả Rập). Cũng có những cái khác, ví dụ:windows-1256 cũng hỗ trợ tiếng Ả Rập. Có một số không có tham chiếu cho những số đó (được gọi là điểm mã) và khi bạn cố gắng mã hóa, bạn sẽ gặp lỗi như sau:

>>> print(txt.encode('latin-1'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 8-14: ordinal not in range(256)

Điều đang nói với bạn là một số số trong đối tượng unicode không tồn tại trong bảng latin-1 nên chương trình không biết cách chuyển nó thành byte.

Máy tính lưu trữ byte. Vì vậy, khi lưu trữ hoặc truyền tải thông tin, bạn cần phải luôn mã hóa / giải mã thông tin một cách chính xác.

Bước mã hóa / giải mã này đôi khi được gọi là bánh sandwich unicode - mọi thứ bên ngoài là byte, mọi thứ bên trong là unicode.

Với điều đó, bạn cần mã hóa dữ liệu một cách chính xác trước khi gửi đến cơ sở dữ liệu của mình; để làm điều đó, hãy mã hóa nó:

q = u"""
    INSERT INTO
       tab1(id, username, text, created_at)
    VALUES (%s, %s, %s, %s)"""

conn = MySQLdb.connect(host="localhost",
                       user='root',
                       password='',
                       db='',
                       charset='utf8',
                       init_command='SET NAMES UTF8')
cur = conn.cursor()
cur.execute(q, (id.encode('utf-8'),
                user_name.encode('utf-8'),
                text.encode('utf-8'), date))

Để xác nhận rằng nó đang được chèn chính xác, hãy đảm bảo rằng bạn đang sử dụng mysql từ một thiết bị đầu cuối hoặc ứng dụng hỗ trợ tiếng Ả Rập; nếu không - ngay cả khi nó được chèn đúng cách, khi nó được hiển thị bởi chương trình của bạn - bạn sẽ thấy các ký tự rác.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mối quan hệ nhiều-nhiều trong MySQL

  2. Vị trí của các bảng cơ sở dữ liệu - MySQL - Windows XP

  3. Laravel 5.1 - Kết nối MySQL Homestead. `Kết nối bị Từ chối` &` Không có tệp hoặc thư mục nào như vậy`

  4. Nhận danh sách tất cả các tên cột trong bảng không có NULL làm giá trị mặc định của chúng?

  5. Làm cách nào để sao chép tệp dữ liệu csv sang Amazon RedShift?