Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stocker du texte arabe dans la base de données mysql en utilisant python ?

Pour clarifier certaines choses, car cela vous aidera également à l'avenir.

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

Ce n'est pas une chaîne arabe. Ceci est un objet unicode , avec des points de code Unicode. Si vous deviez simplement l'imprimer, et si votre terminal prend en charge l'arabe, vous obtiendriez une sortie comme celle-ci :

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

Maintenant, pour obtenir la même sortie comme Arabic (الطيران) dans votre base de données, vous devez encoder la chaîne.

L'encodage prend ces points de code ; et les convertir en octets pour que les ordinateurs sachent quoi en faire.

L'encodage le plus courant est donc utf-8 , car il prend en charge tous les caractères de l'anglais, ainsi que de nombreuses autres langues (y compris l'arabe). Il y en a d'autres aussi, par exemple, windows-1256 prend également en charge l'arabe. Certains n'ont pas de références pour ces nombres (appelés points de code), et lorsque vous essayez d'encoder, vous obtenez une erreur comme celle-ci :

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

Ce que cela vous dit, c'est qu'un certain nombre dans l'objet Unicode n'existe pas dans la table latin-1 , donc le programme ne sait pas comment le convertir en octets.

Les ordinateurs stockent des octets. Ainsi, lors du stockage ou de la transmission d'informations, vous devez toujours les encoder/décoder correctement.

Cette étape d'encodage/décodage est parfois appelée le unicode sandwich - tout ce qui est à l'extérieur est en octets, tout ce qui est à l'intérieur est en Unicode.

Avec cela à l'écart, vous devez encoder correctement les données avant de les envoyer à votre base de données; pour cela, encodez-le :

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

Pour confirmer qu'il est inséré correctement, assurez-vous que vous utilisez mysql à partir d'un terminal ou d'une application prenant en charge l'arabe; sinon - même s'il est inséré correctement, lorsqu'il est affiché par votre programme - vous verrez des caractères parasites.