14

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

这是我的例子。

我有这个名字: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/ |
+--------------------------+----------------------------+
4

4 回答 4

14

你试过了吗,这个查询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()
于 2013-02-11T14:26:32.083 回答
6

设置默认客户端字符集:

<?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);
?>
于 2016-11-25T18:12:59.113 回答
3

您的问题在于从数据库中读取数据时如何显示数据。您正在查看被错误解释为拉丁语 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 字节的代码点被重新解释为两个 latin-1 代码点每个。

由于您正在运行 Python 2,因此您不需要.encode()已经对数据进行编码。如果您插入unicode对象会更好;所以你想解码

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

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

你可能想阅读 Python 和 Unicode:

于 2013-02-11T12:26:20.850 回答
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');
于 2014-01-31T17:57:44.297 回答