2

1.sqlite3

import sqlite3
con=sqlite3.connect("g:\\mytest1.db")
cur=con.cursor()
cur.execute('create  table test (上市  TEXT)')
con.commit()
cur.close()
con.close()

我成功创建了一个测试表 mytest1.db 和一个汉字名称“上市”作为字段。

2.在mysql命令控制台中。

C:\Users\root>mysql -uroot -p   
Welcome to the MySQL monitor.  Commands end with ; or \g.  
mysql> create database mytest2;  
Query OK, 1 row affected (0.00 sec)  
mysql> use mytest2;  
Database changed  
mysql> set names "gb2312";  
Query OK, 0 rows affected (0.00 sec)  
mysql> create table  stock(上市 TEXT) ;  
Query OK, 0 rows affected (0.07 sec)  

可以得出结论:在mysql控制台中可以使用汉字。

3.pymysql

代码31

import pymysql
con = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='******')
cur=con.cursor()
cur.execute("create database  if not exists mytest31")
cur.execute("use mytest31")
cur.execute('set names "gb2312" ')
cur.execute('create table  stock(上市 TEXT) ')
con.commit()

代码32

import pymysql
con = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='******')
cur=con.cursor()
cur.execute("create database  if not exists mytest32")
cur.execute("use mytest32")
cur.execute('set names "gb2312" ')
cur.execute('create table  stock(上市  TEXT) ')
con.commit()

出现同样的问题

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 21-22: o rdinal not in range(256)

4.mysql-python-connect

代码 41

import mysql.connector  
config={'host':'127.0.0.1', 
        'user':'root',  
        'password':'123456',  
        'port':3306 , 
        'charset':'utf8' 
        }  

con=mysql.connector.connect(**config) 
cur=con.cursor()
cur.execute("create database  if not exists mytest41")
cur.execute("use mytest41")
cur.execute('set names "gb2312" ')
str='create table  stock(上市  TEXT)'
cur.execute(str)

代码 42

import mysql.connector  
config={'host':'127.0.0.1', 
        'user':'root',  
        'password':'******',  
        'port':3306 , 
        'charset':'utf8' 
        }  

con=mysql.connector.connect(**config) 
cur=con.cursor()
cur.execute("create database  if not exists mytest42")
cur.execute("use mytest42")
cur.execute('set names "gb2312" ')
str='create table  stock(上市.encode("utf-8") TEXT)'
cur.execute(str)

相同的错误,例如在 pymysql 中。

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 22-23: o
rdinal not in range(256)

中文字符不能作为字段名肯定是python mysql模块的一个bug。
1.python sqlite3模块中可以使用汉字作为字段名。
2. mysql 控制台中的字段名只有设置名称“gb2312”才能使用汉字

4

2 回答 2

5

pymysql.connect() 接受一个字符集参数。我已经测试charset="utf8"并且charset="gb2312"两者都有效(Python 3,PyMySQL 0.6.2)。在这种情况下,您不需要使用"SET NAMES"查询。

import pymysql
con = pymysql.connect(host='127.0.0.1', port=3306,
                      user='root', passwd='******',
                      charset="utf8")
cur = con.cursor()
cur.execute("create database if not exists mytest31")
cur.execute("use mytest31")
cur.execute("create table stock(上市 TEXT)")
con.commit()
于 2014-04-22T19:46:34.540 回答
0

encode应该在你应该做的时候decode。要将中文字符转换为 unicode 字符,请使用:

"上市".decode("GB18030")

这是一种通常用于中文字符的编码。 latin-1将不起作用,因为大多数汉字不在其范围内。GB18030编码应该可以工作,但如果没有,您可以尝试许多其他编码,例如或gbkbig5_hkscs通常用于在香港/中国进行的编码)。

Unicode 错误很容易发现,它们显示为u'\ufffd'(编码时将是中间带有问号的菱形)。

我希望这可以帮到你!

编辑: 我对你的评论有些困惑。

>>> print type("上市")
<type 'str'>
>>> print type("上市".decode("GB18030"))
<type 'unicode'>

str.decode()返回 Unicode。

于 2014-04-22T04:50:20.027 回答