sql >> Databasteknik >  >> RDS >> Mysql

Hur lagrar man arabisk text i mysql-databas med python?

För att förtydliga några saker, för det kommer att hjälpa dig i framtiden också.

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

Detta är inte en arabisk sträng. Detta är ett unicode-objekt , med unicode-kodpunkter. Om du helt enkelt skulle skriva ut det, och om din terminal stöder arabiska, skulle du få utdata så här:

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

Nu, för att få samma utdata som Arabic (الطيران) i din databas måste du koda strängen.

Kodning tar dessa kodpunkter; och konvertera dem till byte så att datorer vet vad de ska göra med dem.

Så den vanligaste kodningen är utf-8 , eftersom det stöder alla tecken i engelska, plus många andra språk (inklusive arabiska). Det finns andra också, till exempel windows-1256 stöder även arabiska. Det finns några som inte har referenser för dessa siffror (kallas kodpunkter), och när du försöker koda får du ett felmeddelande som detta:

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

Vad det säger dig är att något nummer i unicode-objektet inte finns i tabellen latin-1 , så programmet vet inte hur man konverterar det till byte.

Datorer lagrar bytes. Så när du lagrar eller överför information måste du alltid koda/avkoda den korrekt.

Detta kodnings-/avkodningssteg kallas ibland unicode-sandwich - allt utanför är bytes, allt inuti är unicode.

Med det ur vägen måste du koda informationen korrekt innan du skickar den till din databas; för att göra det, koda det:

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

För att bekräfta att den har infogats korrekt, se till att du använder mysql från en terminal eller applikation som stöder arabiska; annars - även om det är korrekt infogat, när det visas av ditt program - kommer du att se skräptecken.



  1. Samla rekursiva JSON-nycklar i Postgres

  2. PDO-fel:Ogiltigt parameternummer:parametern har inte definierats

  3. Hur kontrollerar man om en MySQL-anslutning är SSL-krypterad?

  4. SQL Server Pre-Login Handshake Acknowledgement Error