sql >> Database >  >> RDS >> Mysql

Hoe Arabische tekst op te slaan in mysql-database met behulp van python?

Om een ​​paar dingen te verduidelijken, want het zal je ook in de toekomst verder helpen.

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

Dit is geen Arabische string. Dit is een Unicode object , met Unicode-codepunten. Als u het gewoon zou afdrukken en als uw terminal Arabisch ondersteunt, zou u de volgende uitvoer krijgen:

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

Om nu dezelfde uitvoer te krijgen als Arabic (الطيران) in uw database, moet u de string coderen.

Coderen is het nemen van deze codepunten; en ze converteren naar bytes, zodat computers weten wat ze ermee moeten doen.

Dus de meest voorkomende codering is utf-8 , omdat het alle karakters van het Engels ondersteunt, plus een heleboel andere talen (inclusief Arabisch). Er zijn ook andere, bijvoorbeeld windows-1256 ondersteunt ook Arabisch. Sommige hebben geen verwijzing naar die nummers (codepunten genoemd), en wanneer u probeert te coderen, krijgt u een foutmelding als deze:

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

Wat dat je vertelt, is dat een nummer in het unicode-object niet bestaat in de tabel latin-1 , dus het programma weet niet hoe het het naar bytes moet converteren.

Computers slaan bytes op. Dus wanneer u informatie opslaat of verzendt, moet u deze altijd correct coderen/decoderen.

Deze stap voor het coderen/decoderen wordt soms de unicode-sandwich genoemd. - alles buiten is bytes, alles binnen is unicode.

Met dat uit de weg, moet u de gegevens correct coderen voordat u deze naar uw database verzendt; om dat te doen, codeer het:

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

Om te bevestigen dat het correct is ingevoegd, moet u ervoor zorgen dat u mysql gebruikt vanaf een terminal of toepassing die Arabisch ondersteunt; anders - zelfs als het correct is ingevoegd, wanneer het door uw programma wordt weergegeven - ziet u afvaltekens.



  1. Kan geen verbinding maken met mysql-database [strato]

  2. Bronbeheer en opgeslagen procedures

  3. Mysql-resultaten groeperen in groepen van vier

  4. DBCC CLONEDATABASE gebruiken om een ​​schema en alleen statistieken te genereren van een gebruikersdatabase in SQL Server 2014 SP2