Mysql
 sql >> Database >  >> RDS >> Mysql

Come memorizzare il testo arabo nel database mysql usando python?

Per chiarire alcune cose, perché ti aiuterà anche in futuro.

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

Questa non è una stringa araba. Questo è un oggetto unicode , con codepoint Unicode. Se dovessi stamparlo semplicemente e se il tuo terminale supporta l'arabo, otterresti un output come questo:

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

Ora, per ottenere lo stesso output come Arabic (الطيران) nel tuo database, devi codificare la stringa.

La codifica sta prendendo questi punti di codice; e convertendoli in byte in modo che i computer sappiano cosa farne.

Quindi la codifica più comune è utf-8 , perché supporta tutti i caratteri dell'inglese, oltre a molte altre lingue (incluso l'arabo). Ce ne sono anche altri, ad esempio windows-1256 supporta anche l'arabo. Ce ne sono alcuni che non hanno riferimenti per quei numeri (chiamati punti di codice) e quando provi a codificare, riceverai un errore come questo:

>>> 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)

Quello che ti sta dicendo è che un numero nell'oggetto unicode non esiste nella tabella latin-1 , quindi il programma non sa come convertirlo in byte.

I computer memorizzano i byte. Quindi, quando si memorizzano o si trasmettono informazioni è necessario codificarle/decodificarle sempre correttamente.

Questo passaggio di codifica/decodifica è talvolta chiamato unicode sandwich - tutto all'esterno è byte, tutto all'interno è unicode.

Detto questo, devi codificare i dati correttamente prima di inviarli al tuo database; per farlo, codificalo:

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))

Per confermare che sia stato inserito correttamente, assicurati di utilizzare mysql da un terminale o da un'applicazione che supporti l'arabo; altrimenti - anche se è inserito correttamente, quando viene visualizzato dal tuo programma - vedrai dei caratteri spazzatura.