2013-02-11 24 views
9

我非常困惑和困惑于我如何将带有不寻常字符的字符串(对于习惯于处理英国英文字符集的人)存储在字符串中。如何使用python正确地将utf-8字符插入到MySQL表中

这是我的例子。

我有这样的名字: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_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/ | 
+--------------------------+----------------------------+ 
+1

据我所知'U“串”'是如何指定UTF8格式 – 2013-02-11 11:58:24

+0

字符串如果这是Python 2,你不需要调用encode()。只有在'mystring'是'unicode'对象时才使用。由于您将源代码编码设置为UTF8,因此您的'mystring' *已经被编码*。 – 2013-02-11 12:38:22

回答

6

难道你试试,这个查询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() 
+3

是的,那是我的问题(以及对字符集的完全误解!)。我最终使用了'con.set_character_set('utf8')cur.execute('SET NAMES utf8;')cur.execute('SET CHARACTER SET utf8;')cur。执行('SET character_set_connection = utf8;')' – user1464409 2013-02-11 14:28:02

3

你的问题是你如何显示从数据库中读取数据时的数据。你正在寻找在UTF-8数据误解释为拉丁文1.

>>> "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对象会更好;所以你要解码代替:

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

通过调用上的编码数据,你问的Python先解码数据(使用默认编码),因此它然后可以编码你.encode()。如果你的Python的默认值已经更改为latin1,你会看到相同的效果;在重新编码为Latin-1之前,UTF-8数据被解释为拉丁文1。

您可能需要Python和Unicode的读了起来:

+0

Martijn,这是Python 2.我怎样才能将数据读回为Latin-1?如果我将行更改为'myinsert = [{“name”:u“Bientôtl'été”,“id”:1}]'然后查看MySQL数据库,它读作'Bientôtl'été',这就是我想(除了我想为一个变量字符串,例如'mystring')做这个。这不是说它不是显示问题吗? – user1464409 2013-02-11 12:35:17

+0

@ user1464409为什么不首先将'mystring'作为'unicode'对象:'mystring = u“Bientôtl'été”' – 2013-02-11 12:38:12

+0

@ user1464409:所以你想*解码*。 '.encode()'没有意义,很可能是你的问题的原因*。 – 2013-02-11 12:40:08

1
<?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'); 
2

设置默认客户端字符集:

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

为我工作,数据库中的文本行被设置为类似latin1_swedish_ci的东西,并返回空值,现在它可以工作。 – 2017-07-18 23:29:03

相关问题