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モジュールのバグに違いない。
1.python sqlite3モジュールでフィールド名に漢字が使えるようになりました。
2.「set name "gb2312"」の場合にのみ、mysql コンソールのフィールド名として漢字を使用できます。

4

2 に答える 2

5

pymysql.connect() charset 引数を受け入れます。私はテスト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エンコーディングは機能するはずgbkですが、そうでない場合は、またはbig5_hkscs(通常、香港/中国内で行われたエンコーディング用)など、試すことができる他のエンコーディングが多数あります。

Unicode エラーは簡単に見つけることができ、次のように表示されますu'\ufffd'(エンコードすると、中央に疑問符が付いたひし形になります)。

これがお役に立てば幸いです!

編集: あなたのコメントには多少混乱しています。

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

str.decode()ユニコードを返します。

于 2014-04-22T04:50:20.027 に答える