ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

MySQL の文字エンコーディングを utf8mb4 にあとから変更する

前も書いたけど、MySQL をいじるには、入力補完してくれる mycli が超便利。
これなしの環境だとめんどうに感じてしまうくらいに!

あとダミーデータの作成は generatedata.com が良さげ。
これはもっと良いサイトありそうなので、ご存知の方、教えてくださいますと幸いです。

さて、練習のためになんとなくデータベースとテーブル作っちゃったけど、
なんの設定もしてないから文字コードが utf8mb4 じゃないじゃん、ってときの対処法。

なんで utf8 でなく utf8mb4 ?

MySQL の公式に解説が出ています。
https://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-upgrading.html

MySQL での utf8 は、1文字を3バイトとする文字エンコーディングです。
一方の utf8mb4 は、1文字を4バイトとしています。
ここから mb4 というのは、「マルチバイト4」の略だと想像できますね。

4バイト文字には、以下のページで書かれている文字群と、絵文字の大部分が該当します。
UTF-8で4バイトになる文字 at softelメモ

これが含まれていると、正しくデータはインサートされず、対応外の文字の部分で切れてしまうそうです。
(参考 : MySQLに絵文字を格納するにはutf8mb4を使う必要があった - F.Ko-Jiの「一秒後は未来」

『今日は初めてのデート💖 わくわく✨』という文が
『今日は初めてのデート』と保存されてしまうので、ブログサービスでは致命的です。

ちなみに MySQL コマンドラインツール上ではエラーが出てはじかれます。
f:id:nekonenene:20160802113705p:plain

(注:後述する character-set-client の設定が utf8mb4 になっていないと、カラムの設定が utf8mb4 でもコマンドラインからデータを入れられません。しばらくそこでハマった)

カラムを utf8mb4 に設定変更

上の画像で出しちゃってますけど、alter table で設定変更します。

今回は
データベース名 : television
テーブル名 : channel
カラム :

`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`region` varchar(10) DEFAULT NULL

となっています。
これの name と region の文字コードを変更したいのですから、

ALTER TABLE television.channel MODIFY `name` VARCHAR(30) character set utf8mb4, MODIFY `region` varchar(10) character set utf8mb4;

と設定します。以上です。カンタンね!

my.cnf の設定

カラム設定にて utf8mb4 で格納できるようにしたところで、
文字列の受け渡し部分が utf8mb4 を認識できないと、
「なんか文字じゃないものが入ってるよ!」って言ってエラー出してしまいます。

上で書きましたが、character-set-client の設定が utf8mb4 でないといけないわけです。

設定は my.cnf に記述します。

/etc/my.cnf を開き(または新規作成し)、以下のように記述します。

[mysqld]
  character-set-server=utf8mb4 ## database 新規作成時のデフォルト文字エンコーディング

[client]
  default-character-set=utf8mb4 ## character_set_client, character_set_connection, character_set_results の設定

その後、以下のコマンドで MySQL サーバーを再起動します。

mysql.server restart

(私はいつも間違うんですが、ここ sudo mysql.server restart と sudo を付けてしまわないこと。もちろんファイル権限の設定によるんですが)


MySQLサーバーの再起動後は再び MySQL を起動し、

SHOW VARIABLES LIKE "chara%";

とコマンドを試して

+--------------------------+------------------------------------------------------+
| Variable_name            | Value                                                |
|--------------------------+------------------------------------------------------|
| character_set_client     | utf8mb4                                              |
| character_set_connection | utf8mb4                                              |
| character_set_database   | utf8mb4                                              |
| character_set_filesystem | binary                                               |
| character_set_results    | utf8mb4                                              |
| character_set_server     | utf8mb4                                              |
| character_set_system     | utf8                                                 |
| character_sets_dir       | /usr/local/Cellar/mysql/5.7.11/share/mysql/charsets/ |
+--------------------------+------------------------------------------------------+

というふうに、utf8mb4 に設定されているのが確認できればOKです。
(それぞれの意味については、こちらのページが簡潔にまとめてくれています : MySQLに日本語でINSERTできない場合 - たこはちの「へのかっぱ」日記

新規テーブル, カラム作成時のデフォルトを変更

上の my.cnf の設定で大丈夫なのですが、
今回のようにすでにデータベースやテーブルを作っている場合は、
新規テーブルや新規カラム作成時のデフォルト文字エンコーディングを変えておくといいでしょう。

新規カラム作成時のための、テーブルのデフォルト文字エンコーディングを変更

ALTER TABLE channel DEFAULT character set utf8mb4 COLLATE utf8mb4_bin;

新規テーブル作成時のための、データベースのデフォルト文字エンコーディングを変更

ALTER DATABASE television DEFAULT character set utf8mb4 COLLATE utf8mb4_bin;

これで安心です。
なお、COLLATE utf8mb4_bin は文字の区別についての設定です。
詳しくは、「寿司ビール問題」の解説をご覧ください。
MySQL と寿司ビール問題 - かみぽわーる

iLok が Software Component Unavailable で動かなかったけど直った!

Windows10 にしたら iLok が動かなくなって困りました。
ちゃんと 最新版の iLok License Manager を公式 https://www.ilok.com/ から入手してインストールしてるのに「う~~~ん」って感じ。

f:id:nekonenene:20160611235915p:plain

これは妖怪(Windows10)のしわざに違いない!
と思ったんですが、ググってみると Windows10 にしてみた DTMer さんの記事を見る感じ、
iLok は Windows10 でもちゃんと動く模様。

ってことは悪いのは自分なので、
以下のようにエラーメッセージが出てたことですし、
『iLok Software Component Unavailable』でググってみました。

f:id:nekonenene:20160611235917p:plain

すると以下のページがヒット!
[solved] Ilok License Manager problems | Cakewalk Forums
英語で書かれてるので日本語に翻訳して解説します。

まず、コントロールパネルを開きます。
そしたら、右上の検索ボックスに『管理ツール』と入力します。
そうすると『管理ツール』という項目が出てきますので、それをクリック。

f:id:nekonenene:20160612000740j:plain

管理ツールの中から『サービス』を選択してください。
すると、以下のようなウィンドウが新しく出てくると思いますので、
その中から『PACE License Services』を探してください。

f:id:nekonenene:20160612001301p:plain

この『PACE License Services』が『実行中』の状態になっていないのが、エラーが出ていた原因です。
ここを右クリックして『開始』を押して、このサービスを実行中にしてみてください。

これで iLok License Manager が起動できるようになるはずです。

また、いちいちこの操作をするのは面倒ですから、
『スタートアップの種類』の項目が『自動』になっていますが、これを『自動(遅延開始)』に設定してあげてください。
右クリックして『プロパティ』を選択すると、その項目はあります。

これで、Windows 起動時にちゃんとこのサービスが自動起動してくれるようになり、
iLok License Manager もふつうに動いてくれるはずです。

f:id:nekonenene:20160612002904p:plain
↑ 今の説明通りにやると、PACE License Services の所はこのようになるはず


ふぅ、これで安心して UVI Workstation が使えます。よかったよかった。

UVI ソフトウェア音源 PlugSound Pro

UVI ソフトウェア音源 PlugSound Pro

↑ これのために iLok 使ってる。けっこうパーカッションの音がいろいろいいのが入ってていい

最近 Waves は iLok から脱却して Waves Central っていうのでオーサライズ(認証)するようになったのでいいですけど、
前のバージョンとか持っててこれにハマる DTMer さんは今後出てきそうですので、助けになれますと幸いです。

URI, URL, URN とは? 違いは?

例えば JavaScript のメソッドにこういうのがあります。

console.log( encodeURI("http://ドメイン.com") );  // "http://%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3.com" と出力される

URI 形式に直してくれる encodeURI メソッドです。

また、Android のプログラミングでは URI オブジェクトが存在します。

URI という言葉に謎を残しつつも URL と同じものと考え頭で処理していたのですが、
URN というものがあることを最近知って、いよいよ気になってきましたので
ちゃんと調べてみることにしました。

参考 : URN (Uniform Resource Name) について-- ごく簡単なHTMLの説明
以下は、この参考記事を読んで自分なりに理解したことを
ざっくりと書いているものですので、しっかり知りたい方は上の参考記事をご覧ください。

1. URI = URL + URN

まず、URI について。
URI には2種類あります。
それが、URLURN です。

両者の違いはこのあとで説明するとして、
ふつう私たちが想像する URI は URL の方です。
URN の表現形式をすぐに想像したらなかなかの変態です。

この URI は、インターネット上にあるファイルの場所を示すための文字列です。
URLURN では、その表現方法が明確に変わっていきます。

ちなみに Wikipediaさんによると
Uniform Resource Identifier の略で、日本語に直すと『統一資源識別子』だそうな……。謎の日本語だ。

2. URL は相対的な場所

URL はご存知の通り、Webブラウザに打ち込むアレです。
http://, https://, mailto://, ftp://, などなど、いろんなプロトコルがありますね。

例えば http://mycompany.com/about.html にあった about.html を、
hello ディレクトリの下に置いたとしたら、そのファイルにアクセスする URL は
http://mycompany.com/hello/about.html と変わります。

URL はこのように、サーバー内でどこにあるかの位置を示す文字列です。

Uniform Resource Locator の略で、日本語に直すと『統一資源位置指定子』だそう。もっといい訳し方なかったんですか……。

3. URN はファイルにIDを与える考え方

URN は Uniform Resource Name の略です。

URL では、ファイルの位置によって URI文字列が変わっていましたが、
これはどの位置にファイルがあっても URI文字列の変わらない形式です。
方法としては、インターネット上のファイルにIDを与え、そのIDを使用して URI 文字列を作ります。

URI 文字列は例えば以下のようになります。
urn:namespace:the:id:for:file

urn: から始まるのがポイント。もしかしたら、Google の OAuth2 認証関連で
urn:ietf:wg:oauth:2.0:oob という文字列を見たことがある人もいるかもしれませんね。

これは urn:ietf とある通り、IETF という機関が、そのファイルの存在と場所を保証してくれている URN となります。
見方はよくわかりませんが、実際に、IETF が管理してる wg/oauth の記事群も確認できます。

もしかしたら昔はこの文字列でWebブラウザからアクセスできるようにする構想もあったかもしれませんが、
現在のブラウザはURLにしか対応していませんね……。

というわけで、ざっくりとですが、
URI, URL, URN の違いについての説明でした。