質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1540閲覧

pythonからmysqlに接続すると文字化けする

Nero1129

総合スコア130

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/02 03:26

前提・実現したいこと

FastAPIをMySQLと接続してDockerで管理してみる

こちらのサイトを参考に、FastAPI環境をDockerにて作成し実行したのですが、ブラウザで見ると下記のように日本語が文字化けしてしまいダメでした。

# 文字化けの状況 [{"age":15,"id":1,"name":"太郎"},{"age":18,"id":2,"name":"次郎"},{"age":20,"id":3,"name":"花子"}]

mysqlだけにアクセスして覗いてみると、普通に文字化けせずに閲覧できるので、Pythonで実行したときに問題があるのだと思います。
Dockerでデータベースの環境を構築するのも初めてなので、取り合えず、下記にmysqlのDockerfileなどを貼っておきます。

docker

1# docker-compose.ymlの中身 2version: '3' 3services: 4 mysql: 5 container_name: 'mysql' 6 # path配下のDockerfile読み込み 7 build: db/ 8 # コンテナが落ちたら再起動する 9 restart: always 10 tty: true 11 environment: 12 MYSQL_DATABASE: sample_db 13 MYSQL_USER: user 14 MYSQL_PASSWORD: password # ユーザのパスワード 15 MYSQL_ROOT_PASSWORD: password # ルートパスワード 16 TZ: 'Asia/Tokyo' 17 # command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin 18 volumes: 19 - ./db/initdb.d:/docker-entrypoint-initdb.d # 定義どおりにテーブル作成 20 - ./db/conf.d:/etc/mysql/conf.d # MySQLの基本設定(文字化け対策) 21 - ./db/log:/var/log/mysql # ログの保存 22 - ./db/data:/var/lib/mysql # データベースの場所 23 expose: 24 - "3306" 25 networks: 26 - default 27 28networks: 29 default: 30 driver: bridge 31

dockerfile

1# mysqlのDockerfile 2FROM mysql:5.7 3 4# MySQLの操作ログのファイルを作成 5RUN touch /var/log/mysql/mysqld.log

my.cnf

1# mysqlの設定ファイル 2[mysqld] 3character-set-server=utf8 # mysqlサーバー側が使用する文字コード 4skip-character-set-client-handshake # 文字化け対策 5default-storage-engine=INNODB # InnoDBを使用 6explicit-defaults-for-timestamp=1 # テーブルにTimeStamp型のカラム用 7general-log=1 # 実行したクエリの全ての履歴を記録 8general-log-file=/var/log/mysql/mysqld.log # ログの出力先 9collation-server=utf8_general_ci 10 11[mysqldump] 12default-character-set=utf8 13 14[mysql] 15default-character-set=utf8 16 17[client] 18default-character-set=utf8 # mysqlのクライアント側が使用する文字コード

python

1# データベースとの接続に使用したPythonのコード 2from sqlalchemy import create_engine 3from sqlalchemy.ext.declarative import declarative_base 4from sqlalchemy.orm import sessionmaker, scoped_session 5 6 7# 接続したいDBの基本情報を設定 8user_name = "user" 9password = "password" 10host = "mysql" # docker-composeで定義したMySQLのサービス名 11database_name = "sample_db" 12 13DATABASE = 'mysql://%s:%s@%s/%s?charset=utf8' % ( 14 user_name, 15 password, 16 host, 17 database_name, 18) 19 20# DBとの接続 21ENGINE = create_engine( 22 DATABASE, 23 encoding="utf-8", 24 echo=True 25) 26 27# Sessionの作成 28session = scoped_session( 29 # ORM実行時の設定。自動コミットするか、自動反映するか 30 sessionmaker( 31 autocommit=False, 32 autoflush=False, 33 bind=ENGINE 34 ) 35) 36 37# modelで使用する 38Base = declarative_base() 39# DB接続用のセッションクラス、インスタンスが作成されると接続する 40Base.query = session.query_property()

一応、不備がないかすべてUTF8かを確認したのですが、見る限りすべてUTF8で文字化けするような設定はないように思えるのですが、どこか間違っていればご教示よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2020/06/02 13:23

問題がどこにあるかを切り分けてみましょう。たとえば ・ブラウザの問題ではないか → curl等でレスポンスを直接見てみる ・mysqlの問題か → pythonのソースに定数で日本語(UTF8)を埋め込んでそれを返してみる
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問