iku8log

飛行機って本当怖いよね。Webエンジニアとしてサービス作ったり、アフィリエイトしたりしてます。

MySQLでのサンプルDB「sakila」を使ってみるとエラー出た

最近、SQLものすごく大事だなと思って勉強しています。 SQL(主に参照系)を勉強したいので、勉強するにしてもテーブルとかデータとか考えて作るのは面倒。

そこで、いいサンプル無いかなと探していると、MySQLが提供している「sakila」というサンプルDBを発見しました! MySQL :: Other MySQL Documentation 「sakila database」があるので、zipとかでダウンロードしてください。

SQLでのimport手順は下記にあります。僕は面倒なので、MySQL WorkBenchでimportしました。 MySQL :: Sakila Sample Database :: 4 Installation

※現時点でimportするまでしかしてないです。

と、import作業を行っていると、テーブルが途中までしか入っていないのを発見。 いろいろ問題があったので調べてみました。

環境

CentOS7 5.5.52-MariaDB

問題点と改善策

sakira The used table type doesn't support FULLTEXT indexes

MySQL WorkBenchでimportした際に、このようなエラーメッセージが出てきました。 FULLTEXTとはインデックスのことのようです。特定の文字列を渡してあげると、マッチ度合いが高いものから抽出されるようです(メモ程度)。 MySQLで全文検索 - FULLTEXTインデックスの基礎知識|blog|たたみラボ

で、このFULLTEXTの何が問題かというと、「私のDBのバージョンではサポートされていませんでした」というのが結論です。 どうやらMariaDB5系では不可でした。

正確に言うと、データベースエンジンが問題だったようで。公式サイトによると

Full-text indexes can be used only with MyISAM and Aria tables, from MariaDB 10.0.5 with InnoDB tables and from MariaDB 10.0.15 with Mroonga tables

つまり、データベースエンジンのMySAMとAriaではMariaDB 10.0.5からサポート、InnoDBでは10.0.15からサポート(間違ってらコメント下さい) で、sakila.schema.sql(テーブル作るやつ)を見ると、FULLTEXTを使うテーブルにInnoDBと記述されていたので、MariaDB10.0.15以上が必要だとわかります。

CREATE TABLE film_text (
  film_id SMALLINT NOT NULL,
  title VARCHAR(255) NOT NULL,
  description TEXT,
  PRIMARY KEY  (film_id),
  FULLTEXT KEY idx_title_description (title,description)
)ENGINE=InnoDB DEFAULT CHARSET=utf8; --ここ!

MariaDBをアップデートして上げたら、問題なく全てのテーブルがimportされ、データもimportすることが出来ました。 以下でアップデート出来る。 https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university&distro=CentOS&distro_release=centos7-amd64–centos7&version=10.1

これから、sakilaのDBを使って、SQLを書く練習をしていきます。また、それもいつか共有しまっす!

コメント

SQLってホント大事。な気がすごくする。 データベースエンジンもまだちゃんと理解してない。 MySQLMariaDBの違いも微妙。

DBって奥が深いぜ。

SPAがGoogle検索エンジンにインデックスされない問題

現在SPAでサイトを構築しているのですが、うまく検索エンジンにインデックスされません。

対象とか環境とか

  • AjaxつかってSPAを作ってるひと
  • 僕のAngularJSでSPAを構築(ホントはAngular2がしたい。でもホントはreactがしたい)
  • SPAとかAjaxとか非同期とか、なんかかっこいいから使いたい

SPAがインデックスされない

もちろん各ページには一意のURLが必要ですが。それにしてもインデックスされない。 一意のURLにする方法はハッシュバング(シャープとビックリマーク → #!)を使う方法があります。

http://xxx.com/#!/post/1

みたいになる。 このハッシュバングについては、無理やり感があるようです(しゃーなし作った仕様 by Google

ハッシュバングを使えば、インデックスされるようですが、今回実験した結果まだインデックスされていない。 トップページはインデクスされるのですが、その他ページがインデックスされません。もちろん一意なURLです。

というか、 Fetch as Googleで各ページを登録したのですが、何故かURLが「/」になってしまいます。検索エンジンに出てくるtitleはトップページ、titleの下に出てくるものは登録したページの内容です。で、その検索結果のリンクを踏むとトップページに遷移。 出来てるのか、出来てないのか謎(出来てないんでしょう)

みんなどうしてるのか?

いろいろ探していると以下の記事を発見。

https://productforums.google.com/forum/#!msg/webmasters/bvw4M3WBlKY/i7Cd65HgBwAJ

f:id:iku8:20170612230357p:plain

僕と同じようなことを嘆いている。 ハッシュバングでサイトを見れるけど、検索エンジンボットが見に来てくれてない?的な。

そんな嘆きに対して

Did you set up your server to handle requests for URLs that contain escaped_fragment ?

お?escaped_fragment 何だこれは、と、調べてみると

HTMLスナップショットを作る仕組みらしい

そもそもHTMLスナップショットが何か分からないので、ググると。 JSでレンダリングした後のHTMLを提供するやつっぽい。

つまりこの仕組では、検索エンジンがSPAをうまくクロール出来ないので、JS実行後の結果(ユーザに見える画面)のHTMLを渡すらしい。 なかなか面倒なことをしている。

で、これにつても少し調べた感じ、HTMLスナップショットは現在使う必要なしとのこと。

Googleの中の人によると

ブラウザで見えるものはGooglebotにも見える クローラーレンダリング能力が向上 HTMLスナップショットはいらん!

とのこと。 ホントかよ!

本当なら、検索エンジンにインデックスされないのは何故?Fetch as Googleでインデックスページしか登録出来ないのは何故?

僕の作ったSPAに何か問題があるのでしょう。 「しゃーなしHTMLスナップショットを作るか」というのはダルいし、終わりかけているものを使うのは無駄な気がするので

history APIの「pushState」を使うことにする。

qiita.com

まとめ

bashってターミナル毎に異なるっぽい

f:id:iku8:20170611235944p:plain ことの発端は、環境変数をexportしてやろうとした時。

ターミナルを2つ開いて、片方でexport、もう片方で呼び出したら、環境変数がセットされてないことに気づきました。 いやいや聞いてないし。しらね….

異なるbashが起動して、環境変数を持っているっぽいですね。

この辺について色々調べようと思いましが、それよりコード書きたいんでまた今度調べます。 おそらく、シェルとかbashとかその辺の知識は、「入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界」を読めばいい感じに理解出来るんじゃないかと思います。 2ヶ月後ぐらいによも。