gpt4 book ai didi

python - 在 Python 中连接到 MySQL 数据库时 UTF-8 不起作用

转载 作者:行者123 更新时间:2023-11-29 21:48:25 27 4
gpt4 key购买 nike

我正在努力让 Python 与我的 UTF-8 编码的 MySQL 数据库(例如包含挪威字符 æøå)兼容。我已经搜索了几个小时,但没能找到任何能按预期工作的东西。以下是从数据库中提取的示例表:

mysql> select * from my_table;
+----+-----------------+
| id | shop_group_name |
+----+-----------------+
| 1 | Frukt og grønt |
| 2 | Kjøtt og fisk |
| 3 | Meieriprodukter |
| 4 | Frysevarer |
| 5 | Bakevarer |
| 6 | Tørrvarer |
| 7 | Krydder |
| 8 | Hermetikk |
| 9 | Basisvarer |
| 10 | Diverse |
+----+-----------------+
10 rows in set (0.00 sec)

所以数据肯定是UTF-8编码的。但是,当运行以下 Python 代码时,它不会给出输出 int UTF-8。这可能有什么问题吗?这与 zipper 无关; cursor.execute(query) 返回的元组已经搞乱了编码。

#!/usr/bin/env python
import MySQLdb

db = MySQLdb.connect(host="localhost",
user="test",
passwd="passwd",
db="mydb",
charset='utf8',
use_unicode=True)

# Set desired conversion of data.
db.converter[MySQLdb.FIELD_TYPE.NEWDECIMAL] = float
db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str
db.converter[MySQLdb.FIELD_TYPE.LONGLONG] = int
db.converter[MySQLdb.FIELD_TYPE.LONG] = int
db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str
db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str
db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str

cursor = db.cursor()
query = 'SELECT * FROM my_table'

allResults = {}
cursor.execute(query)
columns = [desc[0] for desc in cursor.description]
rows = cursor.fetchall()
results = []
for row in rows:
row = dict(zip(columns, row))
results.append(row)
allResults['my_table'] = results

cursor.close()
db.close()

allResults 字典现在包含:

{
'my_table': [
{
'id': 1,
'shop_group_name': 'Fruktoggr\xf8nt'
},
{
'id': 2,
'shop_group_name': 'Kj\xf8ttogfisk'
},
{
'id': 3,
'shop_group_name': 'Meieriprodukter'
},
{
'id': 4,
'shop_group_name': 'Frysevarer'
},
{
'id': 5,
'shop_group_name': 'Bakevarer'
},
{
'id': 6,
'shop_group_name': 'T\xf8rrvarer'
},
{
'id': 7,
'shop_group_name': 'Krydder'
},
{
'id': 8,
'shop_group_name': 'Hermetikk'
},
{
'id': 9,
'shop_group_name': 'Basisvarer'
},
{
'id': 10,
'shop_group_name': 'Diverse'
}
]
}

我真的看不出我做错了什么。我正在 Ubuntu 中的 Python 2.7.6 中运行测试。

更新(将表更改为 UTF-8)

我尝试通过转储数据库并更改转储文件中的字符集和排序规则,然后将其插入新数据库,将表更改为 UTF-8。例如,转储文件的这一部分对应于上面的示例。事情是这样的:

DROP TABLE IF EXISTS `my_table`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`shop_group_name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

这就是我将这部分更改为:

DROP TABLE IF EXISTS `my_table`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`shop_group_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

但是,这仍然不起作用。输出仍然与上面相同。运行 SELECT CHARACTER_SET_NAME FROM information_schema.columns WHERE TABLE_NAME = 'my_table'; 现在会生成 utf8

最佳答案

创建表时,以 UTF-8 创建列:

CREATE TABLE my_table (
...
shop_group_name VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci
);

如果您不指定字符集和排序规则,则 MySQL 使用默认的字符集和排序规则。或者,您可以在 mysql.cnf 中设置默认值。 。

关于python - 在 Python 中连接到 MySQL 数据库时 UTF-8 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33903319/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com