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データベースを取得するにはどうすればよいですか?これは文字セットとその設定方法に関係していると思いますが、技術的な専門用語がなければ、これを説明する簡単なWebページを見つけることができません。私はこれに何時間も苦労してきました!

私はこれを見て、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にエンコードし、それをLatin 1(ISO 8859-1)として誤って解釈し、それぞれ2つのUTF-8バイトにエンコードされたôおよびéコードポイントは2つのlatin-1コードポイントとして再解釈されます各。

Python 2を実行しているので、.encode()すでにデータをエンコードする必要はありません。unicode代わりにオブジェクトを挿入した方がよいでしょう。したがって、代わりにデコードする必要があります。

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

エンコードされたデータを呼び出すことにより.encode()、Pythonに最初にデータをデコードして(デフォルトのエンコードを使用して)、次にエンコードできるようにするように要求します。Pythonのデフォルトがに変更されたlatin1場合、同じ効果が表示されます。Latin-1に再エンコードされる前にLatin1として解釈されるUTF-8データ。

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 に答える