ラベル php の投稿を表示しています。 すべての投稿を表示
ラベル php の投稿を表示しています。 すべての投稿を表示

2013年3月15日金曜日

MySQLの文字コードセット「utf8」と「utf8mb4」

 MySQLの文字コードセット「utf8」は3バイトまでのサポートで4バイトをサポートするのはMySQLバージョン5.5以降からサポートしている文字コードセット「utf8mb4」であるとのことを今更ながら知りました.

MySQL 5.0 Reference Manual > 10.1.10. Unicode Support
http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html
MySQL 5.5 Reference Manual > 10.1.10. Unicode Support
http://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html

簡単なコード(PHP)で動作検証してみました.

$conn=mysql_connect('192.168.0.5:3306','admin','password');

if($conn){
    if(mysql_select_db('test2',$conn)){
        $res=mysql_query('SET NAMES utf8',$conn);        
        if(!$res){
            print(mysql_error()."\n");
        }
        $res = mysql_query("DELETE FROM test");
        if(!$res){
            print(mysql_error()."\n");
        }
        $str="𪀚";
        printf("%s %d bytes\n",$str,strlen($str));
        var_dump(bin2hex($str));
        $res = mysql_query("INSERT INTO test (title) values ('".$str."') ",$conn);
        if(!$res){
            print(mysql_error()."\n");
        }
        $str2="田";
        printf("%s %d bytes\n",$str2,strlen($str2));
        var_dump(bin2hex($str2));
        $res = mysql_query("INSERT INTO test (title) values ('".$str2."') ",$conn);
        if(!$res){
            print(mysql_error()."\n");
        }
        $res=mysql_query('SELECT * FROM test',$conn);
        if($res){
            while($row = mysql_fetch_assoc($res)){
                printf("%s\n",$row['title']);
            }
            mysql_free_result($res);
        }else{
            print(mysql_error()."\n");
        }
    }
    mysql_close($conn);
}

コードでは2つの漢字「𪀚」(鳥+戎)と「田」をデータベースに登録し,検索表示しています.

MySQL 5.0.87の場合,
4バイトの文字があってもエラーは表示されません.
無視されるだけです.

$ php test.php
𪀚 4 bytes
string(8) "f0aa809a"
田 3 bytes
string(6) "e794b0"

また,当然「utf8mb4」はサポートしていませんので,使用しようとするとエラーとなります.

$ php mysql.php
Unknown character set: 'utf8mb4'
𪀚 4 bytes
string(8) "f0aa809a"
田 3 bytes
string(6) "e794b0"

MySQL 5.6.10の場合は4バイトの文字「𪀚」をutf8で登録しようとするとエラーとなります.
$ php test.php
𪀚 4 bytes
string(8) "f0aa809a"
Incorrect string value: '\xF0\xAA\x80\x9A' for column 'title' at row 1
田 3 bytes
string(6) "e794b0"
「utf8mb4」を使うと4バイトの文字をちゃんと登録することができます.
$ php test.php
𪀚 4 bytes
string(8) "f0aa809a"
田 3 bytes
string(6) "e794b0"
𪀚
この投稿では文字化けしてるけど.

4バイト文字を「utf8mb4」で登録できる事はわかったけど,5.0から5.5に移行するにはSQLの変更も必要そう.インデックスサイズも変更となるし.

取りあえず,そういう問題があることだけは把握しておこう.



2012年1月26日木曜日

NetCommons2: はじめてのモジュール開発



NetCommons2のモジュールを作成してみる。

参考にしたサイトは http://ncwiki.commonsnet.org/develop/

公式?かどうかは判らないが、検索して引っかかった。

さっそく、「hello world」を表示するモジュールを作ってみる。

まず、NetCommons2のインストールディレクトリに移動する。
 # cd /var/www/html/nc2
ひな形作成用スクリプトは「maple/generate/script」に保存されている。
 # cd maple/generate/script
「nc.sh」を環境に合わせて修正する。
 # vi nc.sh
これを
 if [ -z "$MAPLE_DIR" ]; then
         MAPLE_DIR="D:/xampp/htdocs/maple/maple"
 fi
こうする。
 if [ -z "$MAPLE_DIR" ]; then
         MAPLE_DIR="/var/www/html/nc2/maple"
 fi
スクリプトを実行して、ひな形を作成する。
 # ./nc.sh module hello simple
   [create]  /var/www/html/nc2/webapp/modules/hello/install.ini
   [create]  /var/www/html/nc2/webapp/modules/hello/language/japanese/main.ini
   [create]  /var/www/html/nc2/webapp/modules/hello/files/css/default/style.css
   [create]  /var/www/html/nc2/webapp/modules/hello/files/js/default/hello.js
   [create]  /var/www/html/nc2/webapp/modules/hello/templates/default/hello_view_main_init.html
   [create]  /var/www/html/nc2/webapp/modules/hello/templates/default/hello_script.html
   [create]  /var/www/html/nc2/webapp/modules/hello/view/main/init/Init.class.php
   [create]  /var/www/html/nc2/webapp/modules/hello/view/main/init/maple.ini
   [create]  /var/www/html/nc2/webapp/modules/hello/view/maple.ini
   [create]  /var/www/html/nc2/webapp/modules/hello/language/japanese/modinfo.ini
あとはひな形を編集していくだけ。
 # cd /var/www/html/nc2/webapp/modules/
ファイル権限を変更しておく。
 # chown -R apache:apache hello
モジュール名を設定する。
 # cd hello
 # vi language/japanese/modinfo.ini
 module_name = "hello world module"
モジュールで表示する文字列「Hello World!」を定義する。
# vi language/japanese/main.ini
 [Hello_View_Main_Init]
  hello_value="Hello World!"
テンプレートで文字列が表示する。
 # vi templates/default/hello_view_main_init.html
 <{*テンプレート内容をここに記述*}>
 <{$lang.hello_value}>
 <{include file="hello_script.html"}>
これで取りあえず完成。

コントロールパネルからモジュールをインストールして動作を確認する。



インストール!




















最後にレイアウト画面でモジュールを配置する。






よっしゃ。ちゃんと「Hello World!」と表示された。


今度はデータベースを使うモジュール作りに挑戦したい。


ゆくゆくはちゃんと使えるモジュールを作るぞ!