---
slug: "mysql-80-client-django-character-set-latin1-utf8mb4"
title: "MySQL 8.0 のクライアントで MySQL 5.7 サーバに接続すると Charset の指定がクライアントからできない"
description: "MySQL 8.0 クライアントで MySQL 5.7 サーバに接続したときに、charset がクライアント側 (utf8mb4) で上書きされて latin1 サーバが日本語を化けさせる問題と対処。"
url: "https://www.ytyng.com/blog/mysql-80-client-django-character-set-latin1-utf8mb4"
publish_date: "2021-08-07T07:03:55Z"
created: "2021-08-07T07:03:55Z"
updated: "2026-05-11T13:07:32.895Z"
categories: []
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/f230b38a422d4478a7e22499907c6640.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# MySQL 8.0 のクライアントで MySQL 5.7 サーバに接続すると Charset の指定がクライアントからできない

<p></p>
<p><a href="https://blog.kamipo.net/entry/2021/02/21/193128" target="_blank">MySQL 8.0のクライアントでMySQL 5.7のサーバーに接続するとcharsetが設定されないかもしれない</a></p>
<p>&uarr;こちらで詳しい説明がある。現象としてはページの件名の通り、文字コードがクライアント側から指定できない。</p>
<p></p>
<h2>概要</h2>
<p>Ubuntu を 18 -&gt; 20 にアップグレードして、その上で動いている Django から MySQL 5.7 RDS のデータを取得した時に、日本語がすべて ???????? と表示された。</p>
<p></p>
<h2>ライブラリのバージョン</h2>
<pre>$ cat /etc/issue<br />Ubuntu 20.04.2 LTS \n \l<br /><br />$ apt list --installed | grep mysql<br /><br />WARNING: apt does not have a stable CLI interface. Use with caution in scripts.<br /><br />default-libmysqlclient-dev/focal,now 1.0.5ubuntu2 amd64 [installed]<br />libmysqlclient-dev/focal-updates,focal-security,now 8.0.26-0ubuntu0.20.04.2 amd64 [installed,automatic]<br />libmysqlclient21/focal-updates,focal-security,now 8.0.26-0ubuntu0.20.04.2 amd64 [installed,automatic]<br />mysql-client-core-8.0/focal-updates,focal-security,now 8.0.26-0ubuntu0.20.04.2 amd64 [installed]<br />mysql-common/focal,now 5.8+1.0.5ubuntu2 all [installed,automatic]</pre>
<p></p>
<h2>調査</h2>
<p>ためしに、</p>
<pre>./manage.py dbshell</pre>
<p>してみて、</p>
<pre class="p1">mysql&gt; show variables like "%chara%";</pre>
<p>すると</p>
<pre>mysql&gt; show variables like "%chara%";<br />+--------------------------+-------------------------------------------+<br />| Variable_name | Value |<br />+--------------------------+-------------------------------------------+<br />| character_set_client | latin1 |<br />| character_set_connection | latin1 |<br />| character_set_database | utf8mb4 |<br />| character_set_filesystem | binary |<br />| character_set_results | latin1 |<br />| character_set_server | latin1 |<br />| character_set_system | utf8 |<br />| character_sets_dir | /rdsdbbin/mysql-5.7.33.R2/share/charsets/ |<br />+--------------------------+-------------------------------------------+<br />8 rows in set (0.01 sec)</pre>
<p>こうなる。</p>
<p></p>
<p>本来は、character_set_client などの文字コードが utf8mb4 にならなければいけない。実際、ubuntu18 で同じことをすると、utf8mb4 になる。</p>
<p></p>
<p>また、このキャラクタセットが <code>latin1</code> になる現象は、 ubuntu18 上の <code>mysql</code> コマンドで、 <code>--default-character-set=utf8mb4</code> をつけてみたり、<code>/etc/mysql/conf.d/mysql.cnf</code> の中に 文字コードの設定を書いても一切変わらない。</p>
<p></p>
<h2>クライアント側で(無理やり)対応させる方法</h2>
<p>mysql に接続後、</p>
<pre>SET NAMES utf8mb4</pre>
<p>すると、日本語は化けなくなる。</p>
<p>ちなみに実運用時は無駄なSQLは出したくないため、プロダクション環境でこれは行わないが、Django であれば DB設定をこのようにすることで実現できそう。</p>
<pre>DATABASES = {<br />  'default': {<br />    'ENGINE': 'django.db.backends.mysql',<br />    ...<br />    'OPTIONS': {<br />        'charset': 'utf8mb4',<br />        'init_command': 'set names utf8mb4',<br />    },<br />  },<br />}</pre>
<p></p>
<h2>解決方法</h2>
<p>この状態なら、クライアント側の設定では(上記 SET NAMES utf8mb4 以外では)回避できなそうなので、<strong>サーバ側で文字コードを設定する</strong>。RDS なら、パラメータグループで</p>
<pre>character_set_client<br />character_set_connection<br />character_set_database<br />character_set_results<br />character_set_server</pre>
<p>これらをすべて <code>utf8mb4</code> に設定すれば良い。</p>
<p>実際は utf8mb4 以外の文字コードを使うことって通常無いので、最初からやっとけよって気もするが。</p>
<p>これらのパラメータは dynamic 属性のものなので、設定したら RDS の再起動なしに適用できる。</p>
<p></p>
