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
code31
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()
code32
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-蟒-连接
代码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模块中肯定是中文字符不能用作字段名称的错误 1.中文字符可以在python sqlite3模块中用作字段名 2.只有在你设置名称“gb2312”时才能将中文字符用作mysql控制台中的字段名称
答案 0 :(得分:4)
pymysql.connect()
accepts a charset argument。我测试了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()
答案 1 :(得分:0)
你应encode
decode
。要将中文字符转换为unicode字符,请使用:
"上市".decode("GB18030")
这是一种通常用于中文字符的编码。 latin-1
不起作用,因为大多数中文字符不在其范围内。 GB18030
编码 应该有效,但如果没有,您可以尝试其他一些编码,例如gbk
或big5_hkscs
(通常用于编码)香港/中国)。
Unicode错误很容易被发现,它们显示为u'\ufffd'
(编码后将是一个带有问号的钻石)。
我希望这有用!
编辑:我对你的评论感到有些困惑。
>>> print type("上市")
<type 'str'>
>>> print type("上市".decode("GB18030"))
<type 'unicode'>
str.decode()
返回unicode。