[英]Python unicode encoding issue
使用python 2.7.5。 所有數據庫和表都是
我的代碼看起來像這樣:
import MySQLdb as mdb
import urllib2
import sys
import logging
logging.basicConfig(level=logging.INFO)
from bs4 import BeautifulSoup as BS
con = mdb.connect('loclhost', 'root', '', 'mydb');
cur = con.cursor()
cur.execute('SET NAMES utf8;')
cur.execute('SET CHARACTER SET utf8;')
cur.execute('SET character_set_connection=utf8;')
with con:
...
sql_insert = """INSERT INTO Teams (name, category, countryId) VALUES (%s, 1, %s)"""
cursor = con.cursor()
try:
affected_count = cursor.execute(sql_insert, (name, id)) <<< this line
con.commit()
except mdb.IntegrityError:
logging.warn("failed to insert values %s, %s", name, id)
finally:
cursor.close()
...
con.close()
收到錯誤消息:
“ UnicodeEncodeError:'latin-1'編解碼器無法在位置2處編碼字符u'\\ u015f':序數不在范圍內(256)”
上面標記的線。 我究竟做錯了什么?
嘗試:
con = mdb.connect('loclhost', 'root', '', 'mydb',
use_unicode=True, charset='utf8')
這是一個演示,表明它的工作原理:
如果您不使用use_unicode=True
並進行以下設置,則會出現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)
引發異常:
'latin-1' codec can't encode character u'\u221e' in position 0: ordinal not in range(256)
雖然,如果您使用use_unicode=True
,您可以插入unicode而不會出現錯誤:
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:]))
版畫
José Beiträge ∞
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.