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

Problem z kodowaniem Unicode w Pythonie

Wypróbuj:

con = mdb.connect('loclhost', 'root', '', 'mydb', 
                  use_unicode=True, charset='utf8')

Oto demonstracja pokazująca, że ​​to działa:

Jeśli nie używasz use_unicode=True przy następującej konfiguracji otrzymasz UnicodeEncodeError:

import MySQLdb
import config

def setup_charset(cursor, typ='latin1'):
    sql = 'DROP TABLE IF EXISTS foo'
    cursor.execute(sql)
    sql = '''\
        CREATE TABLE `foo` (
          `fooid` int(11) NOT NULL AUTO_INCREMENT,
          `bar` varchar(30),
          `baz` varchar(30),
          PRIMARY KEY (`fooid`)) DEFAULT CHARSET={t}
        '''.format(t=typ)
    cursor.execute(sql)
    sql = 'INSERT INTO foo (bar,baz) VALUES (%s,%s)'

connection = MySQLdb.connect(
    host=config.HOST, user=config.USER,
    passwd=config.PASS, db='test')

cursor = connection.cursor()
setup_charset(cursor, typ='utf8')
sql = u'INSERT INTO foo (bar,baz) VALUES (%s,%s)'
try:
    cursor.execute(sql, [u'José Beiträge', u'∞'])
except UnicodeEncodeError as err:
    # You get this error if you don't use
    # (use_unicode=True, charset='utf8') see below.
    print(err)

podnosi wyjątek:

'latin-1' codec can't encode character u'\u221e' in position 0: ordinal not in range(256)

Chociaż, jeśli używasz use_unicode=True , możesz wstawić kod Unicode bez błędu:

connection = MySQLdb.connect(
    host=config.HOST, user=config.USER,
    passwd=config.PASS, db='test',
    use_unicode=True,
    charset='utf8')
cursor = connection.cursor()
cursor.execute(sql, ['José Beiträge', '∞'])
cursor.execute('SELECT * from foo')
for row in cursor:
    print(u'{} {}'.format(*row[1:]))

wydruki

José Beiträge ∞



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Baza danych PhalconPHP dołącza do ORM

  2. Oblicz percentyl na podstawie częstotliwości w MySQL

  3. VARCHAR vs TEXT w MySQL

  4. UKŁADANIE „utf8_general_ci” jest nieprawidłowe dla ZESTAWU ZNAKÓW „latin1”

  5. mysql_query zwraca tylko typ łańcucha dla typu int/fload db