如何使用python将utf-8字符正确插入MySQL表中

use*_*409 12 python mysql utf-8

我非常困惑和困惑的是如何在其中存储具有不寻常字符的字符串(对于习惯于处理英国英语字符集的人).

这是我的例子.

我有这个名字: Bientôt l'été

这就是我创建表格的方式:

CREATE TABLE MyTable(
    'my_id' INT(10) unsigned NOT NULL,
    'my_name' TEXT CHARACTER SET utf8 NOT NULL,
    PRIMARY KEY(`my_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

使用这个简化的python脚本我试图将字符串插入MySQL数据库和表:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb

mystring = "Bientôt l'été"

myinsert = [ { "name" : mystring.encode("utf-8").strip()[:65535], "id" : 1 } ]

con = None
con = MySQLdb.connect('localhost', 'abc', 'def', 'ghi');
cur = con.cursor()
sql = "INSERT INTO 'MyTable' ( 'my_id', 'my_name' ) VALUES ( %(id)s, %(name)s ) ; "
cur.executemany( sql, myinsert )
con.commit()
if con: con.close()
Run Code Online (Sandbox Code Playgroud)

如果我然后尝试读取数据库中的名称,则将其存储为: Bientôt l'été

我希望它阅读: Bientôt l'été

如何让python脚本/ MySQL数据库执行此操作?我认为这与字符集及其设置有关,但我找不到一个简单的网页,无需任何技术术语即可解释这一点.几个小时以来我一直在努力奋斗!

我已经看了这个,我看到character_set_server设置为latin1但我不知道这是问题还是如何改变它:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

Ade*_*taş 10

你试过这个查询吗? set names utf8;

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb

mystring = "Bientôt l'été"

myinsert = [{ "name": mystring.encode("utf-8").strip()[:65535], "id": 1 }]

con = MySQLdb.connect('localhost', 'abc', 'def', 'ghi');
cur = con.cursor()

cur.execute("set names utf8;")     # <--- add this line,

sql = "INSERT INTO 'MyTable' ( 'my_id', 'my_name' ) VALUES ( %(id)s, %(name)s ) ; "
cur.executemany( sql, myinsert )
con.commit()
if con: con.close()
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是我的问题(以及对字符集的完全误解!).我结束了使用此`con.set_character_set( 'UTF8')cur.execute( 'SET NAMES UTF8;')cur.execute( 'SET CHARACTER SET UTF8;')cur.execute( 'SET是character_set_connection = UTF8;')` (3认同)

Ima*_*shi 5

设置默认的客户端字符集:

<?php
$con=mysqli_connect("localhost","my_user","my_password","my_db");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

// Change character set to utf8
mysqli_set_charset($con,"utf8");
mysqli_close($con);
?>
Run Code Online (Sandbox Code Playgroud)