CensOS 7 + mariaDB のソケットエラー & 日本語文字化け

mariaDB のインストールから始めて、簡単に遊べるようになるまでに打ったコマンドと出会ったエラーを自分用にメモ。
結果的にぶつかった問題はタイトルにある2点だった。

# 環境
- Windows 8.1
- VirtualBox 5.0.28
- Vagrant 1.8.1
- CentOS 7.0

仮想環境は[Windows 8.1 + Cygwin + Vagrant で CentOS 7.0 に PHP 7 をインストールする](http://qiita.com/hirapi/items/ef5364fa4a0a03aeb4b0)で入れたやつ。

# この記事のなかみ
- [mariaDB インストール＆接続](http://qiita.com/hirapi/items/fb4217e9d96384839701#mariadb-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%8E%A5%E7%B6%9A)
    - [socket エラー](http://qiita.com/hirapi/items/fb4217e9d96384839701#socket-%E3%82%A8%E3%83%A9%E3%83%BC)
- [直打ちで DB 操作](http://qiita.com/hirapi/items/fb4217e9d96384839701#%E7%9B%B4%E6%89%93%E3%81%A1%E3%81%A7-db-%E6%93%8D%E4%BD%9C)
    - 日本語が「?」になる  
    [デフォルト書き換え](http://qiita.com/hirapi/items/fb4217e9d96384839701#%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%8C%E3%81%AB%E3%81%AA%E3%82%8B) or [データベース個別設定](http://qiita.com/hirapi/items/fb4217e9d96384839701#%E5%80%8B%E5%88%A5%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)

# mariaDB インストール＆接続

```
[root@localhost /]# yum install mariadb mariadb-server
Complete!
```

## socket エラー

```
[root@localhost /]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
```

( ﾟдﾟ)

[mysqlソケットエラー解決法 - ウマい話、ちょいくれや。](http://d.hatena.ne.jp/TamaC/20090330/1238418696)
（2009年のブログに2015年までお礼コメントついてるの、なんか良い）

```
[root@localhost /]# cat /var/lib/mysql/mysql.sock         # このファイルあるのか
cat: /var/lib/mysql/mysql.sock: No such file or directory # 無い
[root@localhost /]# touch /var/lib/mysql/mysql.sock       # つくっちゃえ（空ファイル）
[root@localhost /]# mysql                                 # 途中だけど試しに
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
```

再起動だけちょっと注意？ 今回は`mariadb`

```
[root@localhost /]# chown mysql:mysql /var/lib/mysql      # 所有者変更
[root@localhost /]# ls -l /var/lib/mysql/                 # 所有者確認
drwx------ 2 mysql mysql     4096 Nov 27 12:17 mysql      # mysqlさんちのmysqlさんのものになった
[root@localhost /]# systemctl restart mariadb             # 再起動
[root@localhost /]# mysql
Welcome to the MariaDB monitor.                           # やったー
```

途中、エラーのおわりが`(2)`から`(111)`になってた。
ぐぐってもよくわからなかったので後日 φ(。。)

# 直打ちで DB 操作
ユーザー・パスワードの設定は措くとして、コマンド直打ちでデータを入れてみる。
データベース zoo にテーブル animals を作り、カラムに id（自動採番）と name を用意。
（SQL 文よくミスるのでついでに書いとく。）

```
MariaDB [(none)]> CREATE DATABASE zoo;
MariaDB [(none)]> USE zoo;
Database changed
MariaDB [(zoo)]> CREATE TABLE animals (
    -> id int auto_increment,
    -> name varchar(255),
    -> PRIMARY KEY (id)
    ->);
MariaDB [(zoo)]> SHOW COLUMNS FROM animals;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
```

適当にねこさんたちを入れてみる。

```
MariaDB [zoo]> INSERT INTO animals (name) VALUES ('とびみけさん'), ('shironeko-san');
Query OK, 2 row affected, 1 warning (0.00 sec)
MariaDB [zoo]> SELECT * FROM animals;
+----+---------------+
| id | name          |
+----+---------------+
|  1 | ??????        |
|  2 | shironeko-san |
+----+---------------+
```

とびみけさん……

## 日本語が「?」になる
[mysqlで文字コードをutf8にセットする](http://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a)
[MariaDBの日本語の文字化けを解消する](http://qiita.com/aiiro/items/1c160f5cb70c0850e8ce)

データベースの文字コードが Latin-1 なるものになってるのが悪いんだそう。

```
MariaDB [(zoo)]> SHOW variables LIKE "chara%"; # 出力は一部抜粋
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_database   | latin1                     |
| character_set_server     | utf8                       |
+--------------------------+----------------------------+
```

とりあえず
1. mariaDB のデフォルトを変更する
2. 新しくデータベース作る
がよいっぽい。既存のデータベースを残したい場合は
1. 既存データベースの設定を変更する
2. 新しくテーブル作る（？）
って感じっぽい。テーブル作り直すなら既存のデータベースにこだわる必要もないかも？

mariaDB の文字コード設定を変更する方法から。
一度 mariaDB を抜けて `/etc/my.cnf` を編集。

```
MariaDB [zoo]> exit
Bye
[root@localhost /]# vim /etc/my.cnf
```

ここを書き足す。

```bash:/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8  # ここ

[client]                   # ここ
default-character-set=utf8 # ここ
```

再起動して入り直し。
文字コード確認するとちゃんと UTF-8 になってる。

```
MariaDB [none]> SHOW variables LIKE "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_database   | utf8                       |
+--------------------------+----------------------------+
```

#### 注意：既存のデータベース・テーブルの設定は Latin-1 のまま
書き換えたのはあくまでデフォルトなので、もう作っちゃったものは変わらない。

```
MariaDB [none]> USE zoo                    # my.cnf 編集前に作ったデータベース
MariaDB [zoo]> SHOW variables LIKE "chara%"; 
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_database   | latin1                     |
+--------------------------+----------------------------+
```

```
MariaDB [zoo]> CREATE DATABASE zoo_2;
MariaDB [zoo]> USE zoo_2                   # my.cnf 編集後に作ったデータベース
MariaDB [zoo_2]> SHOW variables LIKE "chara%"; 
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_database   | utf8                       |
+--------------------------+----------------------------+
```

この zoo_2 で新しくテーブル作って日本語入れると無事に表示される。わーい。
既存のデータベースの設定を変えるには↓

### 個別で設定を変更する
データベース zoo の文字コードを変えるにはこう。

```
MariaDB [zoo]> ALTER DATABASE zoo default charset=utf8;
```

↓変わってる。

```
MariaDB [zoo]> SHOW variables LIKE "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_database   | utf8                       |
+--------------------------+----------------------------+
```

ただし変わったのは zoo のデフォルトであって（たぶん）、
**既存のテーブルは Latin-1 のまま。**
上記の注意と同じで、新しく作ったテーブルは UTF-8 になってる。

```
# テーブル animals はやっぱりだめ
MariaDB [zoo]> INSERT INTO animals (name) VALUES ('みけさん');
MariaDB [zoo]> SELECT * FROM animals;
+----+---------------+
| id | name          |
+----+---------------+
|  1 | ??????        |
|  2 | shironeko-san |
|  3 | ????          |
+----+---------------+
```

```
# テーブル animals_2 を作ってみたらいけた（CREATE TABLE コマンドは略）
MariaDB [zoo]> INSERT INTO animals_2 (name) VALUES ('みけさん');
MariaDB [zoo]> SELECT * FROM animals_2;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | みけさん     |
+----+--------------+
```

上にリンク貼った記事では既存のテーブルでも `ALTER TABLE` 文で変わるって書いてあったけど
試してみたところ変わらなかった。なんでだろ。


# ひとまずおわり
データベース niwasaki に nekosan テーブルを作るべきだった。
名前変えるの面倒くさいらしいのでデータベース名は慎重につけましょう。