如何正确地插入UTF-8字符到使用MySQL表蟒蛇(How to correctly insert

2019-08-16 21:29发布

我非常困惑,并通过我如何存储与特殊字符的字符串疑惑(的人谁是用来与英国英语字符集处理)在其中。

这里是我的榜样。

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

Answer 1:

你有没有尝试,这个查询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()


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


Answer 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 } ]

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

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

  • 在Python的Unicode指南

  • 务实的Unicode由斯内德尔德

  • 绝对最低每一个软件开发人员绝对,积极必须知道的关于Unicode和字符集(没有借口!)由Joel Spolsky的



Answer 4:

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


文章来源: How to correctly insert utf-8 characters into a MySQL table using python