###前提・実現したいこと
SQL ゼロからはじめるデータベース操作を読みながらSQLを勉強している初心者です。現在ビューの作成をしているのですがうまく行っていません。問題のCREATE VIEW文を実行する前に、TABLEとVIEWを作成しているので、それらを先に示します。
TABLE Shohin:
+-----------+----------------+---------------+--------------+--------------+------------+ | shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka | torokubi | +-----------+----------------+---------------+--------------+--------------+------------+ | 0001 | Tシャツ | 衣服 | 1000 | 500 | 2009-09-20 | | 0002 | 穴あけパンチ | 事務用品 | 500 | 320 | 2009-09-11 | | 0003 | カッターシャツ | 衣服 | 4000 | 2800 | NULL | | 0004 | 包丁 | キッチン用品 | 3000 | 2800 | 2009-09-20 | | 0005 | 圧力鍋 | キッチン用品 | 6800 | 5000 | 2009-01-15 | | 0006 | フォーク | キッチン用品 | 500 | NULL | 2009-09-20 | | 0007 | おろしがね | キッチン用品 | 880 | 790 | 2008-04-28 | | 0008 | ボールペン | 事務用品 | 100 | NULL | 2009-11-11 | +-----------+----------------+---------------+--------------+--------------+------------+
VIEW ShohinSum:
MySQL
1CREATE VIEW ShohinSum (shohin_bunrui, cnt_shohin) AS 2SELECT shohin_bunrui, count(*) 3FROM Shohin 4GROUP BY shohin_bunrui;
###発生している問題
次のCREATE VIEW文でビューを定義したのですが、
MySQL
1CREATE VIEW ShohinSumJim (shohin_bunrui, cnt_shohin) AS 2SELECT shohin_bunrui, cnt_shohin 3FROM ShohinSum 4WHERE shohin_bunrui = '事務用品';
mysql> SELECT * FROM ShohinSumJim;
としても
Empty set (0.00 sec)
と言われてしまいます。
###環境
Windows7にてxamppを使ってインストールしたMySQLを使っています。
- MySQL: Server version: 5.6.25 MySQL Community Server (GPL)
- 文字コード: cp932 (Shift JIS)
###自分で調べたこと
VIEWの定義にあるSELECT文
MySQL
1SELECT shohin_bunrui, cnt_shohin 2FROM ShohinSum 3WHERE shohin_bunrui = '事務用品';
では
+----------------+-------------+
| shohin_bunrui | cnt_shohin |
+----------------+-------------+
| 事務用品 | 2 |
+----------------+-------------+
となり、空ではありません。このことからWHERE句には問題がないように見えます。
VIEWの定義にあるSELECT文の中のWHERE句の等号を不等号に変える。
MySQL
1CREATE VIEW ShohinSumJim (shohin_bunrui, cnt_shohin) AS 2SELECT shohin_bunrui, cnt_shohin 3FROM ShohinSum 4WHERE shohin_bunrui <> '事務用品';
この場合はmysql> SELECT * FROM ShohinSumJim;
で
+----------------+-------------+
| shohin_bunrui | cnt_shohin |
+----------------+-------------+
| キッチン用品 | 4 |
| 事務用品 | 2 |
| 衣服 | 2 |
+----------------+-------------+
となり、VIEW ShohinSumがそのまま取り出されています。
これは先程の結果とは異なり、WHERE句に問題があるように見えます。
先ほどのVIEWの定義にあるSELECT文を実行。
SELECT shohin_bunrui, cnt_shohin FROM ShohinSum WHERE shohin_bunrui <> '事務用品';
+----------------+-------------+
| shohin_bunrui | cnt_shohin |
+----------------+-------------+
| キッチン用品 | 4 |
| 衣服 | 2 |
+----------------+-------------+
今度は不等号の処理が正しく行われているように見えます。
###最後に
SQLを勉強し始めたばかりなので、勝手がわからず困っています。
何かご存知であればよろしくお願いします。
###追記
eripongさんから”show create viewの結果はどうなりますか?"という情報の追加依頼がありました。結果はすごい横長の1行のテーブルだったので、少し直して書きます。
TXT
1View: 2 shohinsumjim 3Create View: 4 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `shohinsumjim` AS select `shohinsum`.`shohin_bunrui` AS `shohin_bunrui`,`shohinsum`.`cnt_shohin` AS `cnt_shohin` from `shohinsum` where (`shohinsum`.`shohin_bunrui` = '闔 蜿・貍?包スィ陷ゥ') 5character_set_client: 6 cp932 7collation_connection: 8 cp932_japanese_ci
このCreate View列のwhere (
shohinsum.
shohin_bunrui = '闔 蜿・貍?包スィ陷ゥ')
が文字化けしているからテーブル内の「事務用品」と一致せずEmpty set
と言われてしまうのでしょうかね。
###追記 - まとめ
eripongさんの回答と、その中で教えてくださったリンク「10.1.12. メタデータ用の UTF-8 」を参考にして、スクリプトファイルもしくはコピペ元の文字コードをUTF-8にすることで解決しました。その際に調べたこと、分かったことを軽くまとめておこうと思います。
####原因
今回発生した問題はmysql> SHOW VARIABLES LIKE 'character\_set\_%';
で確認できるメタデータと呼ばれる文字セットの不一致が原因だと思われます。MySQLクライアントを開始時には次のように変数がセットされていました。
mysql> show variables like 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | +--------------------------+--------+
この時点では文字セットはutf8で統一されているのですが、set names cp932;
もしくはCHARSET cp932;
で文字コードを変えると、
mysql> show variables like 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | cp932 | | character_set_connection | cp932 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | cp932 | | character_set_server | utf8 | | character_set_system | utf8 | +--------------------------+--------+
となって一部はcp932に変更されますが、全てではないようです。この後のどの操作がどの変数を使っているのかまでは理解していないのですが、character_set_database
が一致していないのはよくなさそうですね。
####対策
一つはcp932を使わずにutf8を使うこと。コマンドプロンプトから直接入力したりコピペするとやはりShift-JISだからうまく表示はさません。しかしutf8で書いたスクリプトファイルにまとめて実行するとちゃんと表示されるようです。しかしコマンドプロンプト上で簡単に確認したい場合はとても面倒になりますね。
もう一つは上の変数をcp932に統一すること。私はWindows7でXAMPPを利用してインストールしたMySQLを利用しています。C:\xampp\mysql\bin\my.ini
が設定ファイルのようですが、それを変えることでcp932に統一できればと思います。まだここについてはよく調べていないので、本当にうまくいくかはわかりません。
いずれにせよ今は練習段階で簡単に触れる用にWindows上でやっていますが、将来的にはLinux上で扱うことになると思うので、その場合はmy.confを設定してutf8で統一してできるようになりたいと思います。
####最後に
初めての質問投稿でこんなにも多くの回答をいただけるとは思いませんでした。皆様大変有難うございました。
回答3件
あなたの回答
tips
プレビュー