- 投稿日:2020-03-25T20:14:31+09:00
MySQLでインポートしたデータが文字化けした
はじめに
MySQL(厳密にはMariaDB)で、日本語を含むCSVファイルをインポートしたが、
select文でそれを表示させたところ、日本語部分が文字化けしてしまった。
不具合の詳細と、解決に向けて試したこと、解決策について備忘録も兼ねて記す。環境
- XAMPP
- MariaDB
- コマンドプロンプト
(バージョンなどは後述のように再インストールしたため不明。)
発生した不具合
tb2.csvA106,中村,26 A107,田中,24 A108,鈴木,23 A109,村井,25 A110,吉田,27というファイルをMariaDBで読み込んだ。
load data infile "db1\\tb2.csv" into table tb2 fields terminated by ",";因みに、書き込むテーブルのカラムは以下。
bang varchar(10) nama varchar(10) tosi int出力結果とエラー文
+------+--------+------+ | bang | nama | tosi | +------+--------+------+ | A106 | 荳ュ譚・| 26 | | A107 | 逕ー荳ュ | 24 | | A108 | 驤エ譛ィ | 23 | | A109 | 譚台コ・| 25 | | A110 | 蜷臥伐 | 27 | +------+--------+------+試したこと
再起動
XAMPP Control Panelの対応する箇所を再起動した。
具体的にはMySQLの行のStopボタンをクリック。
CSVファイルの文字コードを確認・書き換え
サクラエディタを使ってShift-JISやUTF-8に変更して保存し直し、インポートし直した。
データベースの設定を確認・書き換え
show variables like "chara%";このコマンドを用いて、データベースに設定されているコマンドを確認した。
ここではVariable_nameがcharacter_set_databaseである項目のValueについて確認。その後、
SET character_set_database=utf8を使ってcharacter_set_databaseをUTF-8に書き換えた。
また"utf8"部分をcp932(=Shift JISに対応)にも書き換え、
それぞれに合わせてCSVファイルの文字コードもUTF-8やShift-JISに変更してみた。my.iniファイルの書き換え
MariaDB上の、初期の文字コードを設定するものであるようだ。
ここなどを参照。
XAMPPを再インストール
ファイルが壊れた、バージョンが古いなどの原因かどうかを確かめる意図。
再インストール前のバージョンなどはメモし忘れた。解決につながった方法
色々と試しすぎて、この方法のみによって解決したかと言われると確約はできないのだが
結論からいうと、不具合の原因はMySQL側ではなく、コンソール側に存在していたようだ。MariaDBでファイルをインポートしたはいいものの、その文字コードをコマンドプロンプト上で取り扱うにあたって、
それがコマンドプロンプトで設定されている文字コードとは異なっていたため、文字化けが発生していた、という可能性がある。解決に当たってCSVファイルの文字コードを散々変更して試しているので、
コマンドプロンプト上の設定文字コードとCSVファイルの文字コードが一致するパターンがあっても不思議ではない。
それならばもっと早い段階で問題が解決していてもおかしくはないはず。
従って、これだけが原因だったのかと言われると疑問が残る。とはいえ、以下の方法で解決した。
コンソール(コマンドプロンプト)の文字出力に使用されている文字コードを変更する。
コンソール上で以下のコードを打ち込んだ。(数字65001はUTF-8に対応している)chcp 65001
- 投稿日:2020-03-25T16:14:21+09:00
bundle installでmysql2のエラーが出たときに見る解決法
bundle installエラーが出た際、解決まで結構時間がかかってしまったので、まとめて置こうと思います。
エラー内容
実行コマンドbundle install //エラー An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.
実行コマンドbundle install //エラー Could not find gem 'sass-rails (>= 6)' in any of the gem sources listed in your Gemfile. Run `bundle install` to install missing gems.原因
見てみるとどうやらlsslが見つけられないのが原因らしい。
エラーの内容の中にこのエラーがある人はこの記事の方法が役に立つかもしれません。
lsslが見つからないということらしい。エラー原因ld: library not found for -lssl
そもそもldってなに?
ldとは、GNUリンカーと呼ばれるコマンドで、コンパイルされたオブジェクトファイルから実行可能ファイル( またはライブラリ)を作成することができるものです。
続いて-lsslってなに?
mysql2 gemインストール時にldコマンドに与えられたオプションの一つで、libssl.dylibをライブラリ検索範囲から探してねって言うことらしいです。
解決
以下のコマンドを実行
実行コマンドbundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
実行コマンドの意味
実行コマンドが意味不明だったため、後で見てもわかるようにまとめておきます。
bundle config
設定システムを編集します。--local build.mysql2
ローカルでmysql2をビルドした際に以下の通りビルドしてください。--with-ldflags=-L/usr/local/opt/openssl/lib
ビルドする際は以下を参照してください。
参照先は-L/usr/local/opt/openssl/libです。「今後ローカルでmysql2をインストールする場合は/usr/local/opt/openssl/libの場所を参照してくださいね」
って感じですかね。
参考記事
ありがとうございました!
【Rails】MySQL2がbundle installできない時の対応方法
mysql2 gemインストール時のトラブルシュート
Ruby STUDIO
- 投稿日:2020-03-25T14:48:12+09:00
初心者|docker-compose|PHP+ Nginx + MySQL
docker-compose.ymlファイルだけでphp環境を簡単に構築できないかと思い、調べて見ました。(残念ながらdocker-compose.ymlファイルだけではダメでしたが...)
リスペクトな記事
この記事を作成するにあたり、参考にさせていただいた記事です。
本件、同様の既存記事を踏襲する内容となります。DockerによるPHP開発環境構築(PHP + MySQL + Nginx)
Docker + Nginx + PHP-FPM なら40秒くらいで環境を準備できる docker-compose が楽しくなってきました。したいこと
dockerを使って、ローカル環境でphpを使いたい
したこと
1) docker-compose.yml の用意
下記、コピペでOKです
docker-compose.ymlversion: "3" services: db: image: mysql:5.7 volumes: - ./db/mysql:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: root_pass_fB3uWvTS phpmyadmin: image: phpmyadmin/phpmyadmin:latest restart: always ports: ["8888:80"] depends_on: ["db"] php: image: php:7.4-fpm volumes: - ./nginx/html:/usr/share/nginx/html - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini depends_on: ["db"] nginx: image: nginx:latest volumes: - ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf - ./nginx/html:/usr/share/nginx/html restart: always ports: ["8080:80"] depends_on: ["php"]2)とりあえず docker-compose up
docker-compose.ymlファイルのあるディレクトリで
docker-compose up -d
してみてください。エラーが出るはずです。エラーが出たことを確認しましたら
docker-compose down
で停止してください。エラーが出た理由は
nginx:
サービスで使う default.conf ファイルがクライアント側に存在しないためです。default.conf ファイルを用意する必要があります
3)【重要】 nginx用のdefault.confファイルの用意
default.conf ファイルを用意します。
default.confserver { listen 80; server_name localhost; root /usr/share/nginx/html; index index.php index.html; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ [^/]\.php(/|$) { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }4) default.confファイルの保存先
上記の工程(2)で
docker-compose up -d
をした後であれば、docker-compose.ymlファイルのあるディレクトリにnginx
php
db
という3つのディレクトリが生まれているはずです。ディレクトリ
nginx / conf.d
の中にdefault.confファイルを保存してください。「default.conf」というディレクトリが先に存在している場合は、削除してください(入れ替えてください)
5)もう一度 docker-compose up
再度に
docker-compose up -d
してください。今回は上手く立ち上がったのではないでしょうか?6)確認してみる
動作確認のため、ディレクトリ
nginx / html
の中にindex.php
ファイルをおいてください。(index.php
ファイルの内容は何でも結構です)index.phpの例<?php echo phpinfo();ブラウザで
http://localhost:8080/
へアクセスして表示されれば確認完了です
補足
データベースとphpMyAdminは不要です
上記の docker-compose.yml には個人的な都合でmysqlとphpmyadminを入れておりますが、php環境を作る目的だけであれば不要なものです。
よってサービスdb:
とphpmyadmin:
は削除いただいてOKです。ただし、削除する場合はサービスphp:
内にあるdepends_on: ["db"]
を削除することを忘れないように。もし、phpMyAdminへアクセスする場合は
http://localhost:8888/
です。
ユーザー名root
、パスワードroot_pass_fB3uWvTS
でログインできるはずです。nginx−default.conf の記述について
こちらの参考サイトがとても勉強になりました。
参考サイト:nginx連載4回目: nginxの設定、その2 - バーチャルサーバの設定
参考サイト:nginx連載5回目: nginxの設定、その3 - locationディレクティブnginx と PHP-FPM の関係性について
こちらの参考サイトがとても勉強になりました。
参考サイト:nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する
FastCGIって何?
こちらの参考サイトがとても勉強になりました。