如何使用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
aunicode
对象设置为: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);
?>