[MySQL] .sqlスクリプトを使ってみる

phpMyAdminのソースを見てたら、
“sql”というフォルダがあって、
その中に、拡張子”.sql”のファイルがいくつかある。

どうやら、SQLのスクリプトみたい。
https://qiita.com/ydzum1123/items/219d8e60843a678be719
・・・そんなんあったんだ。
ちょっと使ってみよう。

ちなみに、phpMyAdminは、
WindowsPCにインストール済み。
ダウンロードして展開するだけ。

phpMyadmin:https://www.phpmyadmin.net/

○テスト用DBの作成

新しく、DBを作成して、
以前と同じサンプルデータベースを作ってみる。
(WindowsでphpとMySQLの連携)

データベースの作成と、”phpuser”に権限付与。

mysql> create database phptest2;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on phptest2.* to 'phpuser'@'localhost';
Query OK, 0 rows affected (0.08 sec)
mysql> show grants for 'phpuser'@'localhost';
+---------------------------------------------------------------+
| Grants for phpuser@localhost                                  |
+---------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'phpuser'@'localhost'                   |
| GRANT ALL PRIVILEGES ON `phptest`.* TO 'phpuser'@'localhost'  |
| GRANT ALL PRIVILEGES ON `phptest2`.* TO 'phpuser'@'localhost' |
+---------------------------------------------------------------+
3 rows in set (0.00 sec)

では、テーブルの作成以降を、
phpuserで行うために、ログインし直し。

mysql> exit
Bye
>mysql -u phpuser -p
[パスワードを入力]
mysql> use phptest2

○スクリプトの作成・実行→エラー

とりあえず、スクリプトを以下のように作っておく。

・make_sql-sample.sql

create table hanbai(
id int not null primary key auto_increment,
shouhin_id int,
uriage int);

create table shouhin(
id int not null primary key,
name varchar(20));

insert into shouhin values
(1,"テレビ"),
(2,"DVD"),
(3,"パソコン");

insert into hanbai (shouhin_id, uriage) values
(1, 320000),
(2, 160000),
(3, 180000),
(1, 128000),
(3, 98000),
(2, 140000),
(1, 175000);

で、実行。

mysql> source [パス]\make_sql-sample.sql
Query OK, 0 rows affected (0.25 sec)
Query OK, 0 rows affected (0.03 sec)
ERROR 1366 (HY000): Incorrect string value: '\x86\xE3\x83\xAC\xE3\x83...' for column 'name' at row 1
Query OK, 7 rows affected (0.02 sec)
Records: 7  Duplicates: 0  Warnings: 0

なんかエラー出たし。
テーブルの作成と、hanbaiテーブルは上手くいったみたい。

mysql> show tables;
+--------------------+
| Tables_in_phptest2 |
+--------------------+
| hanbai             |
| shouhin            |
+--------------------+
2 rows in set (0.00 sec)

mysql> select * from hanbai;
+----+------------+--------+
| id | shouhin_id | uriage |
+----+------------+--------+
|  1 |          1 | 320000 |
|  2 |          2 | 160000 |
|  3 |          3 | 180000 |
|  4 |          1 | 128000 |
|  5 |          3 |  98000 |
|  6 |          2 | 140000 |
|  7 |          1 | 175000 |
+----+------------+--------+
7 rows in set (0.00 sec)

このエラーって多分、
日本語入力を受け付けてないんですよね?
データベース”phptest”では普通にできてるのに。

○文字セットの確認

文字セット見比べてみよう。
参考:https://www.dbonline.jp/mysql/database/index4.html

mysql> select * from information_schema.schemata
    -> where schema_name='phptest2'\G
*************************** 1. row ***************************
              CATALOG_NAME: def
               SCHEMA_NAME: phptest2
DEFAULT_CHARACTER_SET_NAME: utf8
    DEFAULT_COLLATION_NAME: utf8_general_ci
                  SQL_PATH: NULL
1 row in set (0.00 sec)
mysql> select * from information_schema.schemata
    -> where schema_name='phptest'\G
*************************** 1. row ***************************
              CATALOG_NAME: def
               SCHEMA_NAME: phptest
DEFAULT_CHARACTER_SET_NAME: utf8
    DEFAULT_COLLATION_NAME: utf8_general_ci
                  SQL_PATH: NULL
1 row in set (0.00 sec)

同じだし。

ちなみに、コマンドラインから直接打つと、

mysql> insert into shouhin values
    -> (1,"テレビ"),
    -> (2,"DVD"),
    -> (3,"パソコン");
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0

できたw
スクリプトだと、ちょっと違うのかな?

ちなみに、文字セットの設定変更して、
スクリプトでやってみるとどうなるか?

mysql> alter database phptest2 character set cp932;
Query OK, 1 row affected (0.00 sec)
mysql> select * from information_schema.schemata
    -> where schema_name='phptest2'\G
*************************** 1. row ***************************
              CATALOG_NAME: def
               SCHEMA_NAME: phptest2
DEFAULT_CHARACTER_SET_NAME: cp932
    DEFAULT_COLLATION_NAME: cp932_japanese_ci
                  SQL_PATH: NULL
1 row in set (0.00 sec)

で、スクリプトを次のように作って、

・make_sql-sample2.sql

insert into shouhin values (4,"プリンタ");

実行。

mysql> source [パス]\make_sql-sample2.sql
Query OK, 1 row affected (0.03 sec)
mysql> select * from shouhin;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | テレビ       |
|  2 | DVD          |
|  3 | パソコン     |
|  4 | 繝励Μ繝ウ繧ソ |
+----+--------------+
4 rows in set (0.03 sec)

あー、上手くいってねーw

4番削除して、
一旦、文字セットをutf8に戻して、
スクリプトの中身をシングルコーテにしたらどうかな?

・make_sql-sample2.sql

insert into shouhin values (4,'プリンタ');
mysql> source [パス]\make_sql-sample2.sql
Query OK, 1 row affected (0.02 sec)
mysql> select * from shouhin;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | テレビ       |
|  2 | DVD          |
|  3 | パソコン     |
|  4 | 繝励Μ繝ウ繧ソ |
+----+--------------+
4 rows in set (0.00 sec)

ダメでした。そういう問題じゃない。
スクリプトの文字コードの問題かなぁ?

○スクリプトのエンコードの確認

スクリプトのエンコードを「日本語(JIS)」で保存。
(最初はUTF-8,BOM有で保存されてた。)
して、再度実行。

|  4 | $B%W%j%s%?(B |

文字化けの結果が変わりましたけどもw

「日本語(シフトJIS)」で保存。

|  4 | プリンタ |

お、来た。

スクリプトで日本語を扱うとき、
少なくともウチの環境では、
シフトJISで保存しなければならないということで、
今日はこの辺にしときます。

ちなみに、最初の”make_sql-sample.sql”を、
シフトJISで保存してやり直してみた結果上手くいったので、
シングルコーテかダブルコーテかは関係ない。

コメントを残す

メールアドレスが公開されることはありません。