2017-10-18 18 views
0

Pythonプログラムを使用して、Unicode文字を含むテキストをMySQL データベースに書き込みます。例として、文字の二人は、私は、MySQLに関わるほぼすべての文字セットのためにutf8mb4使用MySQLコマンドラインツールでUnicodeを正しく表示する方法

u'\u2640' a symbol for Venus or female 
u'\u2642' a symbol for Mars or male 

です。 、ユニコードの治療が動作するものを除くすべての点で

ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 

:ここ は

[client] 
default-character-set=utf8mb4 

[mysql] 
default-character-set=utf8mb4 

[mysqld] 
default-character-set=utf8mb4 
character-set-server =utf8mb4 
character_set_system =utf8mb4 

また、すべてのテーブルは、これらのパラメータを使用して作成されている/etc/mysql/my.cnfからの抜粋です。ちょうど良い。私は ユニコードをデータベーステーブルに書き込んだり、読み込んだり表示したりすることができますが、 の問題はありません。例外はMySQLコマンドラインツールであるmysqlです。私はここで、金星と 火星Unicode文字を含むテーブル内の行を見てSELECT文を実行 とき、私は画面に表示されるものである:私は、右の欄に表示されるはずです何

| Venus  | ♀  | 
| Mars  | ♂  | 

は標準グリフです金星と 火星です。

MySQLコマンドラインツールでユニコード を正しく表示する方法については、

編集:

私は様々なMySQLのシステムに 変数などを研究のかなりの量を行っている、と私は今、上に示したのmy.cnfの設定は いくつかの深刻な問題を抱えていることを実現します。実際には、サーバーmysqldは、 の設定では起動しませんでした。

default-character-set=utf8mb4 
character-set-system=utf8mb4 

私は[クライアント]オプションは何もしないことはよく分からないが、それは 傷つけていないようです:物事を修正するには、[mysqldを]からこれらを削除します。

Pythonのu '\ u2640'は、単一のUnicode文字「♀」を表します。この は、16進値E29980を含む3バイトまでコンパイルします。私は にUnicodeのすべてのエンコードとデコードに問題はありません。正しい値は で、MySQLテーブルに格納されています。それらが正しく、テーブルから読み出され、 Pythonプログラムによって表示されたとき、彼らはこのように表示されています

♀ Venus 
♂ Mars 

プログラムの出力は、などのテキストエディタ、 によって処理されたファイルにリダイレクトすることができ、すべての場合、正しいUnicode記号が表示されます。

正しいUnicodeシンボルが表示されない場所は、 です。これは、MySQLコマンドラインツールを使用しているときです。 Unicodeシンボルを含むテーブルに対して SELECT文を発行すると、上記の迷惑メール が表示されます。これはWindows固有の問題ではありません。私は、Windows、Mac OS X、 、およびUbuntuでMySQLコマンドラインツールを実行したときと全く同じ 問題を持っています。

+0

実際にどのバイトが列に格納されているかを調べるには、 'HEX'関数を使うことをお勧めします。 'SELECT symbol_name、HEX(symbol_bytes)FROM ...' VenusのUnicode文字の場合、UTF8で正しくエンコードされていれば、 'E29980'が必要です。 – spencer7593

答えて

0

Windowsのcmdとutf8。 Windowsについて話している場合は、chcp 65001に加え、適切なフォントを選ぶだけで十分です。 detailsを参照してください。

毛布。しかし、の代わりに♀のような "Mojibake"について不平を言うならば、hereでMojibakeを見てください。 Venus(別名女性記号)のヘックスは、utf8に正しく格納されたとき、E29980になります。 C3A2 E284A2 E282ACが表示されている場合は、Mojibakeだけでなく、「二重エンコード」があります。

u'\u2640'をMySQLのどこにでも使用しないでください。

関連する問題