2013-02-11 5 views
9

Jestem bardzo zdezorientowany i zaintrygowany tym, jak przechowuję w nich ciągi zawierające nietypowe znaki (do kogoś, kto jest przyzwyczajony do angielskiego zestawu znaków w Wielkiej Brytanii).Jak poprawnie wstawiać znaki utf-8 do tabeli MySQL używając python

Oto mój przykład.

mam tę nazwę: Bientôt l'été

ten sposób tworzę tabelę:

CREATE TABLE MyTable(
    'my_id' INT(10) unsigned NOT NULL, 
    'my_name' TEXT CHARACTER SET utf8 NOT NULL, 
    PRIMARY KEY(`my_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Używanie tego uproszczonego skrypt Pythona próbuję wstawić ciąg do bazy danych MySQL i tabela:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import MySQLdb 

mystring = "Bientôt l'été" 

myinsert = [ { "name" : mystring.encode("utf-8").strip()[:65535], "id" : 1 } ] 

con = None 
con = MySQLdb.connect('localhost', 'abc', 'def', 'ghi'); 
cur = con.cursor() 
sql = "INSERT INTO 'MyTable' ('my_id', 'my_name') VALUES (%(id)s, %(name)s) ; " 
cur.executemany(sql, myinsert) 
con.commit() 
if con: con.close() 

Jeśli spróbuję odczytać nazwę w bazie danych, zostanie ona zapisana jako: Bientôt l'été

chcę go przeczytać: Bientôt l'été

Jak mogę uzyskać skrypt Pythona/bazy danych MySQL, aby to zrobić? Myślę, że ma to coś wspólnego z zestawem znaków i sposobem jego ustawiania, ale nie mogę znaleźć prostej strony, która wyjaśnia to bez technicznego żargonu. Walczę z tym od wielu godzin!

Patrzyłem na to i widzę character_set_server jest ustawiony jako latin1 ale nie wiem czy to jest problem i jak go zmienić:

mysql> show variables like 'char%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
+1

o ile wiem 'u "string"' jest jak określić ciąg w formacie utf8 –

+0

Jeśli to jest Python 2, nie musisz * wywoływać 'kodowania()'. Używaj tylko tego, jeśli 'mystring' jest obiektem' unicode'. Ponieważ ustawiłeś kodowanie kodu źródłowego na UTF8, twoje 'mystring' jest * już zakodowane *. –

Odpowiedz

6

Czy spróbować, to zapytanie set names utf8;

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import MySQLdb 

mystring = "Bientôt l'été" 

myinsert = [{ "name": mystring.encode("utf-8").strip()[:65535], "id": 1 }] 

con = MySQLdb.connect('localhost', 'abc', 'def', 'ghi'); 
cur = con.cursor() 

cur.execute("set names utf8;")  # <--- add this line, 

sql = "INSERT INTO 'MyTable' ('my_id', 'my_name') VALUES (%(id)s, %(name)s) ; " 
cur.executemany(sql, myinsert) 
con.commit() 
if con: con.close() 
+3

Tak, to był mój problem (wraz z kompletnym niezrozumieniem zestawów znaków!). Skończyło się na użyciu tego 'con.set_character_set ('utf8') cur.execute ('SET NAMES utf8;') cur.execute ('SET CHARACTER SET utf8;') cur.execute ('SET character_set_connection = utf8;') ' – user1464409

3

Twój problem jest z tym, jak wyświetlacz dane po przeczytaniu go z bazy danych. Szukasz w UTF-8 Dane mis-interpretowane jako Latin 1.

>>> "Bient\xf4t l'\xe9t\xe9" 
"Bientôt l'été" 
>>> "Bient\xf4t l'\xe9t\xe9".encode('utf8').decode('latin1') 
"Bientôt l'été" 

Powyższy kodował unicode do UTF-8, a następnie źle interpretuje go jako Latin 1 (ISO 8859-1), a ô i é Współrzędne kodowe, które zostały zakodowane do dwóch bajtów UTF-8, są interpretowane jako dwa punkty kodowe Latin-1 każdy.

Ponieważ używasz Pythona 2, nie powinieneś już potrzebować .encode() już zakodowanych danych. Byłoby lepiej, gdyby zamiast tego wstawiono obiekty unicode; więc chcesz dekodowania Zamiast:

myinsert = [ { "name" : mystring.decode("utf-8").strip()[:65535], "id" : 1 } ] 

Dzwoniąc .encode() na zakodowanych danych, prosicie Pythona do pierwszego dekodowania danych (używając domyślnego kodowania), tak że potem może kodować dla Ciebie. Jeśli domyślny dla Twojego Pythona został zmieniony na latin1, zobaczysz ten sam efekt; Dane UTF-8 interpretowane jako łacińskie 1 przed ponownym zakodowaniem do Latin-1.

Możesz przeczytać na Python i Unicode:

+0

Martijn, to jest Python 2. Jak mogę odczytać dane jako Latin-1? Jeśli zmienię linię na 'myinsert = [{" name ": u" Bientôt l'été "," id ": 1}]], a następnie spójrz na bazę danych MySQL, którą odczytuje jako' Bientôt l'été' która jest czym Chcę (z wyjątkiem tego chcę dla zmiennej ciąg, np. 'Mystring'). Czy nie sugerowałoby to, że nie jest to problem z wyświetlaniem? – user1464409

+0

@ user1464409 Dlaczego nie uczynisz 'mystring' obiektem' unicode' w pierwszej kolejności: 'mystring = u" Bientôt l'été "' –

+0

@ user1464409: Więc zamiast tego chcesz * dekodować *. '.encode()' nie ma sensu i może być również * przyczyną * twojego problemu. –

1
<?php 
//Set Beginning of php code: 
header("Content-Type: text/html; charset=UTF-8"); 
mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8'); 

//then create the connection 
$CNN=mysql_connect("localhost","usr_urdu","123") or die('Unable to Connect'); 
$DB=mysql_select_db('db_urdu',$CNN)or die('Unable to select DB'); 
2

Ustaw domyślny zestaw znaków klienta:

<?php 
$con=mysqli_connect("localhost","my_user","my_password","my_db"); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

// Change character set to utf8 
mysqli_set_charset($con,"utf8"); 
mysqli_close($con); 
?> 
+0

pracujący dla mnie, wiersz tekstowy w DB został ustawiony na coś podobnego do latin1_swedish_ci i zwracał wartości null, teraz działa. –

Powiązane problemy