かけがえのない日々

なんややんや。にょろにょろ。

INDEX基本

2006年04月28日 | SQL
##インデックス管理
create index インデックス名 on テーブル名 (フィールド名);
create table テーブル名 (index インデックス名 (フィールド名));
alter table テーブル名 add index インデックス名 (フィールド名);
#先頭何文字かまでをインデックス化したいならば、フィールド名(数字)のように指定します。
create index title_index on bib_tb (title(5));
#通常のselect文の前にexplainと入力すると、select文がどのように実行されたのかを見ることができます
explain select * from bib_tb where title like ('日本%');
#削除
drop index インデックス名 on テーブル名;

インデックスについて(その1

2006年04月14日 | SQL
全文インデックスについて(日本語未対応

インデックスを使った検索が可能となるのは、基本的に完全一致のselect文です。
ただし、あいまい検索(部分一致)のlike演算子を使った場合、前方一致(keyword%)であれば問題ないのですが、中央一致(%keyword%)や後方一致(%keyword)の場合は、インデックスを使用することができません。
これは、レコードの前方から一文字ずつをインデックス化しているためです。
しかし、実際の検索では完全一致や前方一致で検索を行うことは少なく、特定のキーワードを含む検索を行うことの方が大半でしょう。
そのような場合は、全文インデックスを使用します。

※日本語を扱うことはできません。

全文インデックスはnot nullであるvarchar型かtext型のフィールドにしか適用できません。

基本構文は通常のindexを作成する場合と同じです。
create fulltext index インデックス名 on テーブル名 (フィールド名);
create table テーブル名 (fulltext インデックス名 (フィールド名));
alter table テーブル名 add fulltext インデックス名 (フィールド名);
など。

※create tableとalter tableでは、インデックス名を省略できます。

全文インデックスの検索方法は、通常の検索や通常のインデックスを用いた場合とは異なります。
基本構文は以下の通りです。
select フィールド名 from テーブル名 where match (フィールド名) against ('検索語');
したがって、title中にjapanを含むレコードを検索する場合、
select * from bib_tb where match (title) against ('japan');
となります。
≫全文検索の場合、基本的に適合度順出力を行うようです。
(詳しくはこちら)。

MySQLで日本語全文検索を行うには・・・
まず形態素解析やN-gramによって文字列をワードごとに分割し、
スペースで区切り、さらに16進数文字に変換したりしてあたかも日本語ではないかのように装う必要があるようです。


文字列の位置検索と応用

2006年04月01日 | PHP

$_POST[val] == 1234567890icc12345)

 $pNum = mb_strpos($_POST[val],"icc");
 $rNum = mb_strpos($_POST[val],")");
 $lenNum = $rNum - $pNum;
 $get = mb_substr($_POST[val],$pNum,$lenNum);
 

結果
icc12345

 


固体識別番号の取得

2006年04月01日 | PHP
固体識別番号(サブスクライバID)取得方法

固体識別子サブスクライバID)は、端末ごとに全て違います。
人間でいう指紋のようなものです。

この固体識別番号を取得すると、「端末ごとに完全に識別」する事が可能となります。


■ドコモ(DoCoMo・i-mode)編

サイトタグにutn属性をつけると、固体識別番号を送信してもらえます。
ただし、固体識別番号の送信前に、固体識別番号送信の諾否をユーザーに確認する画面が表示され、
ユーザーが確認画面で「YES」ボタンを押した場合のみ固体識別番号が送信されます。

utn属性の付加の仕方
例:
<A href="URL" utn>
<FORM method="メソッド" action="URL" utn>

送信されてくる固体識別番号

MOVA
「DoCoMo/1.0/X503i/c10/ser*********** 」
ユーザーエージェントの後ろに付加される形
serの後ろが固体識別番号

FOMA
「DoCoMo/2.0 YYYY(c10;serXXXXXXXXXXXXXXX; iccxxxxxxxxxxxxxxxxxxxx)」

serXXXXXXXXXXXXXXX
ser:FOMA端末個体識別子
iccxxxxxxxxxxxxxxxxxxxx
icc:FOMAカード個体識別子

詳細→DoCoMo


■AU(ezweb)編

AUは、基本的にサブスクライバID(EZ番号)と呼ばれる固体識別子を毎回送信しています。
(ただし、現在サブスクライバIDの「送信する・しない」をユーザーが選択できるようになっています)

サブスクライバIDは、環境変数 'HTTP_X_UP_SUBNO' に収められています。
perl : $ENV{'HTTP_X_UP_SUBNO'}
PHP : $_SERVER['HTTP_X_UP_SUBNO']

形式:xxxxxxxxxxxxxx_t*.ezweb.ne.jp

詳細→AUサブスクライバID(EZ番号)一覧


■vodafone(ボーダフォン・j-sky)編

ボーダフォンは、パケット通信対応機のみ固体識別番号を取得できます。

vodafoneの場合、固体識別番号は、常にユーザーエージェントに含まれています。

ユーザーエージェント例
Vodafone/1.0/V802SH/SHJ001[/Serial] Browser/UP.Browser/7.0.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 Ext-J-Profile/JSCL-1.2.2 Ext-V-Profile/VSCL-2.0.0
J-PHONE/5.0/V801SH[/Serial] SH/0005aaProfile/MIDP-1.0 Configuration/CLDC-1.0 Ext-Profile/JSCL-1.1.0

/Serial の部分が固体識別番号となります。

携帯電話製造番号はユーザがユーザID通知の送出を許可した場合のみ追加されます。
ユーザーエージェント一覧:vodafone

eregによる正規表現

2006年04月01日 | PHP
if (ereg("^[0-9]{5}$", $splitVal[0])){

     ↑5桁の数字のみ 12304 とか。

if (ereg("^[0-9]{3,10}$", $splitVal[0])){

     ↑3~10桁とかはこう。

ereg('(/[0-9A-Za-z-]+[-.w/]*@([0-9A-Za-z]+[-w]*.){1,4}[0-9A-Za-z]+/)',$mailaddr,$add)


     ↑メルアドっぽいのんとか。

携帯判定
  if (eregi("@docomo.ne.jp$",$from)
   OR eregi("@ezweb.ne.jp$",$from)
   OR eregi("@..vodafone.ne.jp$",$from)
   OR ereg("@jp-..ne.jp$",$from)){