簡體   English   中英

如何使用python將utf-8字符正確插入MySQL表中

[英]How to correctly insert utf-8 characters into a MySQL table using python

我非常困惑和困惑的是如何在其中存儲具有不尋常字符的字符串(對於習慣於處理英國英語字符集的人)。

這是我的例子。

我有這個名字: 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/ |
+--------------------------+----------------------------+

你試過,這個查詢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()

設置默認客戶端字符集:

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

您的問題在於從數據庫中讀取數據時如何顯示數據。 您正在將UTF-8數據誤解為Latin 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,然后將其誤解為Latin 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數據被解釋為Latin 1。

您可能想要閱讀Python和Unicode:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM