🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

2回答

2746閲覧

Mysqlに絵文字をINSERTできない

jiro-sima

総合スコア20

MySQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

2クリップ

投稿2019/12/11 21:23

編集2019/12/12 00:36

Mysqlに絵文字をINSERTしようとすると?に変換されます
INSERT文を打ち込む時点で既に?となっています
例えば、
INSERT INTO test (text) VALUES('✨');
というSQLはコンソール上では
INSERT INTO test (text) VALUES('?');
のように表示され、レコードにも?で登録されます

データベースとテーブルについて文字コードを調べたところ、以下のようになりました
データベースを選択した状態でコマンドshow variables like '%char%';に対し、
character_set_client : utf8mb4
character_set_connection : utf8mb4
character_set_database : utf8mb4
character_set_filesystem : binary
character_set_results : utf8mb4
character_set_server : latin1
character_set_system : utf8
character_sets_dir : [charsetsへのパス]

show create table test; に対し、
| test | CREATE TABLE test (
id int(20) NOT NULL AUTO_INCREMENT,
text varchar(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4
となっています
なお、charcter_set_serverがlatin1になっているのが気になったので調べたところ、
こちらの記事にデータベース作成時に作用するものであるとあった為、今は関係ないものと判断しています

原因、或いは解決法をご存じの方はご教示お願いします

環境

Mysql 5.7.22
接続にEC2のlinux2を使用しています

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

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

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

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

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

maisumakun

2019/12/11 22:40

コンソールには何を使っていますか?
yambejp

2019/12/12 00:15

具体的な絵文字は?
maisumakun

2019/12/12 00:15

mysqlへどのようにコマンドを投げていますか?
guest

回答2

0

自己解決

jdbcのURIに?useUnicode=true&characterEncoding=utf8mb4を追加すると解決しました
回答頂き有難うございました

投稿2019/12/13 12:21

jiro-sima

総合スコア20

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

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

0

正しくデータが投入されていても、出力のインタフェースが正しくなければ
表示することはできません

SQL

1SELECT 'その絵文字';

で、きちんと表示されるのかどうかチェックするところから

投稿2019/12/12 00:17

yambejp

総合スコア116661

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

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

jiro-sima

2019/12/12 00:33

試してみましたがSELECTでも駄目でした コマンドが select '?'; と出力され、結果もカラム、レコード共に?とだけ表示されます
maisumakun

2019/12/12 00:44

CLIも接続に使っているコンソールも、正しく4バイト文字を通すものである必要があります(状況によっては、単なる日本語文字すら打てなかったりもします)。
yambejp

2019/12/12 00:47

> SELECTでも駄目でした そうなると単にコンソールが対応してないだけかもしれません。 ミドルウェアで吸収してデータを利用するアプリ側では 普通に表示できるのでは?
jiro-sima

2019/12/12 00:47

日本語に関しては問題なく処理されています
jiro-sima

2019/12/12 00:53

> yamabejp さん 本題とはずれますがこのシステムは本来Javaを介して登録、取得するものです 検証してみたところ、Javaでの処理は問題なく行われているようでした しかしprepareStatementでのSQL発行の段階から'?'に変換されて登録されており、 取得したものもやはり?となっています そこでコンソールでも調べてみた結果、質問の内容になったという次第です
yambejp

2019/12/12 01:02

select '????野家'; とか表示できますか?
jiro-sima

2019/12/12 01:05

はい、出来ています
A-pZ

2019/12/12 01:16 編集

> Javaでの処理は問題なく行われているようでした > しかしprepareStatementでのSQL発行の段階から'?'に変換されて登録されており PreparedStatement 発行段階で ? となるのでしたら、その処理の前後で、どこで変化しているか見ると良いでしょう。または PreparedStatement とそこへバインドしている処理を書くと回答が見つかるかもしれません。
yambejp

2019/12/12 01:14

サロゲートペアの問題かもと思ったのですがそうでもなさそうですね どうしても正しく登録できないならutf16や32にレベルをあげるか 検索性を無視していいならバイナリーで持てば アプリ側の出力でおかしくなることはないでしょう。 (コンソールの文字化けはそういうものなのでコンソール自体を 対応させないとどうしようもないと思います)
yambejp

2019/12/12 01:16

ちなみにprepare処理は直接sql文をいじらないので 文字化けが確認できるというのは意味が通じませんね
A-pZ

2019/12/12 01:24

> その処理の前後で、どこで変化しているか見ると > PreparedStatement とそこへバインドしている処理 これでわかることもありますよ。
jiro-sima

2019/12/12 01:28

prepareStatementの確認方法は以下の手順で行っています 1.まず値が代入されていないSQLをConnection.prepareStatement()で生成(値の部分は?となっています) 2.そこへsetInt, setStringで値を代入 3.System.out.println()で出力 これによって得られたSQLが絵文字を代入したとき?のまま表示されます ('abc'などは正しく出力されています) この処理を行う直前に該当の変数を確認した場合も正しく出力されます
yambejp

2019/12/13 01:34

もし最終出力先がブラウザなら、最悪unicodeをエスケープシークエンスで 処理すれば良いのでは? ✨→&#x2728
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問