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

如何使用python将utf-8字符正确插入MySQL表,python,mysql,utf-8,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=

我对如何存储带有不寻常字符的字符串(对于习惯于处理英国英语字符集的人)感到非常困惑和困惑

这是我的例子

我的名字是:
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;
使用这个简化的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()
然后,如果我尝试读取数据库中的名称,它将存储为:
Bientôt létÃ

我希望它是这样的:
Bientôt lété

如何让python脚本/MySQL数据库执行此操作?我认为这与字符集及其设置方式有关,但我找不到一个没有任何技术术语的简单网页来解释这一点。我已经为此挣扎了好几个小时了

我已经看过了,我看到
character\u set\u 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/ |
+--------------------------+----------------------------+

问题在于从数据库读取数据时如何显示数据。您看到的是错误解释为拉丁语1的UTF-8数据

>>> "Bient\xf4t l'\xe9t\xe9"
"Bientôt l'été"
>>> "Bient\xf4t l'\xe9t\xe9".encode('utf8').decode('latin1')
"Bientôt l'été"
上面将
unicode
字符串编码为UTF-8,然后将其错误解释为拉丁语1(ISO 8859-1),而
ô
ô
码点(分别编码为两个UTF-8字节)被重新解释为两个拉丁语1码点

因为您正在运行Python 2,所以不需要
.encode()
已经编码的数据。最好是插入
unicode
对象;因此,您希望解码:

通过对编码的数据调用
.encode()
,您要求Python首先对数据进行解码(使用默认编码),以便它可以为您编码。如果python上的默认值已更改为
latin1
,您将看到相同的效果;UTF-8数据在重新编码为拉丁语1之前被解释为拉丁语1

您可能想了解Python和Unicode:

  • 内德·巴奇尔德

  • 乔尔斯波尔斯基


您是否尝试过,此查询
设置名称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()
#/usr/bin/python
#-*-编码:utf-8-*-
导入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;”)#
设置默认客户端字符集:

<?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);
?>


据我所知,
u“string”
是以utf8格式指定字符串的方式如果这是Python 2,则不需要调用
encode()
。仅当
mystring
unicode
对象时才使用该选项。因为您将源代码编码设置为UTF8,所以您的
mystring
已经编码。Martijn,这是Python 2。如何将数据读回拉丁语-1?如果我将行更改为
myinsert=[{“name”:u“Bientôt lété”,“id”:1}]
,然后查看MySQL数据库,它读作
Bientôtété
,这就是我想要的(除了我想对变量字符串执行此操作,例如
mystring
)。这难道不表明这不是一个显示问题吗?@user1464409为什么不首先将
mystring
a
unicode
对象设置为:
mystring=u“Bientôt lété”
@user1464409:所以你想解码。
.encode()
没有意义,很可能是您的问题的原因。Janne,这样做确实有效,但我不知道如何使
mystring
成为unicode对象。我知道我可以用
mystring=u“help!”
来实现这一点,但我不知道当“help!”是从另一个变量或字典(例如)获得时如何实现这一点。我尝试了unicode(),但这似乎不起作用,我不知道这是否是正确的做法。@user1464409:查看我的答案,我已经添加了如何解码到
unicode
。是的,这是我的问题(以及对字符集的完全误解!)。最后,我使用了这个
con.set\u character\u set('utf8')cur.execute('set NAMES utf8;'))cur.execute('set character\u set\u connection=utf8;')
为我工作,数据库中的文本行被设置为类似于拉丁语1\u瑞典语\u ci的值,并返回空值,现在可以工作了。
<?php
//Set Beginning of php code:
header("Content-Type: text/html; charset=UTF-8");
mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8');

//then create the connection 
$CNN=mysql_connect("localhost","usr_urdu","123") or die('Unable to Connect');
$DB=mysql_select_db('db_urdu',$CNN)or die('Unable to select DB');
<?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);
?>