我非常困惑和困惑的是如何用不寻常的字符(对于习惯于处理英国英语字符集的人)存储字符串。
这是我的例子。
我有这个名字: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/ |
+--------------------------+----------------------------+
答案 0 :(得分: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()
答案 1 :(得分: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);
?>
答案 2 :(得分: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字节被重新解释为每个两个latin-1代码点。
由于您运行的是Python 2,因此您不需要.encode()
已编码的数据。如果你插入unicode
个对象会更好;所以你想要解码:
myinsert = [ { "name" : mystring.decode("utf-8").strip()[:65535], "id" : 1 } ]
通过在编码数据上调用.encode()
,您要求Python首先解码数据(使用默认编码),以便它可以为您编码。如果python上的默认值已更改为latin1
,您将看到相同的效果;在重新编码为Latin-1之前,UTF-8数据被解释为拉丁语1。
您可能想要阅读Python和Unicode:
答案 3 :(得分: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');