Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak przechowywać tekst arabski w bazie mysql za pomocą Pythona?

Aby wyjaśnić kilka rzeczy, ponieważ pomoże ci to również w przyszłości.

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

To nie jest arabski ciąg. To jest obiekt Unicode , z punktami kodowymi Unicode. Jeśli miałbyś to po prostu wydrukować, a terminal obsługuje język arabski, otrzymasz następujące dane wyjściowe:

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

Teraz, aby uzyskać takie same dane wyjściowe, jak Arabic (الطيران) w swojej bazie danych, musisz zakodować ciąg.

Kodowanie zajmuje te punkty kodowe; i konwertowanie ich na bajty, aby komputery wiedziały, co z nimi zrobić.

Najpopularniejszym kodowaniem jest więc utf-8 , ponieważ obsługuje wszystkie znaki języka angielskiego oraz wiele innych języków (w tym arabski). Są też inne, na przykład windows-1256 obsługuje również język arabski. Są takie, które nie mają odniesień do tych liczb (zwanych punktami kodowymi), a kiedy spróbujesz zakodować, otrzymasz następujący błąd:

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

Mówi ci to, że jakaś liczba w obiekcie Unicode nie istnieje w tabeli latin-1 , więc program nie wie, jak przekonwertować go na bajty.

Komputery przechowują bajty. Dlatego podczas przechowywania lub przesyłania informacji należy zawsze je poprawnie kodować/dekodować.

Ten krok kodowania/dekodowania jest czasami nazywany kanapką z kodem Unicode - wszystko na zewnątrz to bajty, wszystko wewnątrz to Unicode.

Pomijając to, musisz poprawnie zakodować dane przed wysłaniem ich do bazy danych; aby to zrobić, zakoduj go:

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

Aby potwierdzić, że jest on wstawiany poprawnie, upewnij się, że używasz mysql z terminala lub aplikacji obsługującej język arabski; w przeciwnym razie - nawet jeśli jest wstawiony poprawnie, gdy jest wyświetlany przez twój program - zobaczysz znaki śmieci.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQLSyntaxErrorException w pobliżu ? podczas próby wykonania Przygotowanego Oświadczenia

  2. Jak łatwo określić wiek od urodzin? (php)

  3. Wybierz wiersz i rzędy wokół niego

  4. Sprawdzanie wartości w tablicy wewnątrz jednego zapytania SQL z klauzulą ​​WHERE

  5. MySQL i zestaw zagnieżdżony:powolne JOIN (bez indeksu)