テストの列挙
先にお断り。
長いです。大量です。長いです。
drop table test1;
create table test1 (
`key` varbinary(256),
`val` varbinary(256),
`flags` int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(`key`)
);
insert into innodb_memcache.containers set name='test1', db_schema='furu_test', db_table='test1', key_columns='key', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into test1 set `key`='d1', val='val', flags=0, cas_column=0, expire_time_column=0;
<?php
// 接続
$m = new Memcache();
$r = $m->addServer('localhost', 11211);
// データの取得
$v = $m->get('@@test1.d1');
var_dump($v);
…うまくいかない。
なんで?(答え:keyがvarbinaryだからなんだが)
create table test2 (
pkeys varbinary(256) not null,
val varbinary(256),
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test2 set pkeys='d1', val='val', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test2', db_schema='furu_test', db_table='test2', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test2t', db_schema='test', db_table='test2', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
とりあえず、keyをnot nullにしてみる。
あと、念のため「database名"test"の中」にテーブルを設置してみる(大抵のサンプルがそこにある前提で書いてあったから念のため)。
………駄目。
なんだろう?
create table test3 (
pkeys varchar(256) not null,
val varchar(256),
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test3 set pkeys='d1', val='val', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test3t', db_schema='test', db_table='test3', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test3', db_schema='furu_test', db_table='test3', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
あ、通った。
なんだ?
create table test4 (
pkeys varchar(256) not null,
val varbinary(256),
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test4 set pkeys='d1', val='val', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test4', db_schema='furu_test', db_table='test4', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
もういっちょ同じのを。
…これも通る。
varbinaryイヤなのかしら?
…ってのとは別に、嫌な予感がするのでテスト。
<?php
// 接続
$m = new Memcache();
$r = $m->addServer('localhost', 11211);
// データの取得
$v = $m->get('@@test4.D1');
var_dump($v);
………あぁ通るねぇ orz
varcharだから仕方が無いか orz
create table test5 (
pkeys char(255) not null,
val varbinary(256),
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test5 set pkeys='d1', val='val', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test5', db_schema='furu_test', db_table='test5', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
charも通るんだ。
create table test6 (
pkeys varchar(256) not null,
val text,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test6 set pkeys='d1', val='val', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test6', db_schema='furu_test', db_table='test6', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
valにtextも通るねぇ。
create table test7 (
pkeys varchar(256) not null,
val blob,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test7 set pkeys='d1', val='val', flags=0, cas_column=0, expire_time_column=0;
insert into test7 set pkeys='d2', val='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test7', db_schema='furu_test', db_table='test7', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
…あれ? valがblobでも通るよ?
create table test8 (
pkeys varbinary(256) not null,
val blob,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test8 set pkeys='d1', val='val', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test8', db_schema='furu_test', db_table='test8', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
keyをvarbinaryにしてみる…うんこっちはfalseか orz
どうも、valueにvarbinaryはよいのだけど、keyにするとむずがるみたいだ orz
drop table test9;
create table test9 (
pkeys varchar(256) not null,
val int,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test9 set pkeys='d1', val=100, flags=0, cas_column=0, expire_time_column=0;
insert into test9 set pkeys='d1 2', val=100, flags=0, cas_column=0, expire_time_column=0;
insert into test9 set pkeys='d1_2', val=101, flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test9', db_schema='furu_test', db_table='test9', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
2つ実験。
1つめは「valueにintは?」
答え:通る。ただ、getするとstringになってはくるんだが(苦笑
2つめは「keyの中にあるスペースの扱い」。アンダースコアになってしまうために
$v = $m->get('@@test9.d1 2');
var_dump($v);
って指定をしても、戻りは「string(3) "101"」になる。
create table test10 (
pkeys int not null,
val int,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test10 set pkeys=1, val=100, flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test10', db_schema='furu_test', db_table='test10', key_columns='pkeys', value_columns='val', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
keyにint指定したらどうなるんだろう?
答え:無問題。通りました普通に。
create table test11 (
pkeys int not null,
val1 int,
val2 float,
val3 varchar(256),
val4 varbinary(256),
val5 blob,
val6 datetime,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test11 set pkeys=1, val1=100, val2=1.123, val3='varchar', val4='binary', val5='blob', val6='2014-1-1 10:22:33', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test11', db_schema='furu_test', db_table='test11', key_columns='pkeys', value_columns='val1,val2,val3,val4,val5,val6', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test11_1', db_schema='furu_test', db_table='test11', key_columns='pkeys', value_columns='val1', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test11_2', db_schema='furu_test', db_table='test11', key_columns='pkeys', value_columns='val1,val2', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test11_3', db_schema='furu_test', db_table='test11', key_columns='pkeys', value_columns='val1|val2', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
さて…複数カラムの実験。
ん…「name='test11_1'」以外は全部NG。なんだろ?
create table test12 (
pkeys varchar(256) not null,
val1 varchar(256),
val2 varbinary(256),
val3 blob,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test12 set pkeys='d1', val1='varchar', val2='binary', val3='blob', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test12', db_schema='furu_test', db_table='test12', key_columns='pkeys', value_columns='val1', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test12_1', db_schema='furu_test', db_table='test12', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test12_2', db_schema='furu_test', db_table='test12', key_columns='pkeys', value_columns='val1|val2|val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
「name='test12'」だけ…複数カラムって無理なのかしらん?
drop table test13;
create table test13 (
pkeys varchar(128) not null,
val1 varchar(256),
val2 varchar(256),
val3 varchar(128),
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'utf8mb4', ENGINE=InnoDB;
insert into test13 set pkeys='d1', val1='varchar', val2='binary', val3='blob', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test13', db_schema='furu_test', db_table='test13', key_columns='pkeys', value_columns='val1', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test13_1', db_schema='furu_test', db_table='test13', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test13_2', db_schema='furu_test', db_table='test13', key_columns='pkeys', value_columns='val1|val2|val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
あ、のった。…varbinaryが絡むと駄目なの? エライこと冷遇されてないかい?
「value_columns='val1,val2,val3'」と「value_columns='val1|val2|val3'」、とりあえず、どっちの書式でもOKなんだなぁ。
ちなみに値は「string(19) "varchar|binary|blob"」と一本につながってきます。
ついでに
//
$m->set('@@test13_1.d2', '1|2|3');
//
$v = $m->get('@@test13_1.d2');
var_dump($v);
からの
mysql> select * from test13 \G
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1. row ---------------------------
pkeys: d1
val1: varchar
val2: binary
val3: blob
flags: 0
cas_column: 0
expire_time_column: 0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 2. row ---------------------------
pkeys: d2
val1: 1
val2: 2
val3: 3
flags: 0
cas_column: 20022
expire_time_column: 0
2 rows in set (0.00 sec)
ってな感じで、ちゃんと「分割しての設定」も出来るようです。
create table test14 (
pkeys varchar(256) not null,
val1 varbinary(256),
val2 varbinary(256),
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
);
insert into test14 set pkeys='d1', val1='varchar', val2='binary', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test14', db_schema='furu_test', db_table='test14', key_columns='pkeys', value_columns='val1,val2', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
うんvarbinaryはやっぱり駄目なんだ。
create table test15 (
pkeys int not null,
val1 varchar(256),
val2 varchar(256),
val3 varchar(128),
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'utf8mb4', ENGINE=InnoDB;
insert into test15 set pkeys=1, val1='varchar', val2='binary', val3='blob', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test15', db_schema='furu_test', db_table='test15', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
「keyがint」かつ「valueが複数カラム」…ふむ、普通に通る、っと。
create table test17 (
pkeys varchar(256) not null,
val1 varchar(256),
val2 varchar(256),
val3 varchar(128),
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'latin1', ENGINE=InnoDB;
insert into test17 set pkeys=1, val1='varchar', val2='binary', val3='blob', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test17', db_schema='furu_test', db_table='test17', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
「CHARACTER SET 'latin1'」は通る…latin1はいいんだ。
create table test18 (
pkeys varchar(256) not null,
val1 varchar(256),
val2 varchar(256),
val3 varchar(128),
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'binary', ENGINE=InnoDB;
insert into test18 set pkeys=1, val1='varchar', val2='binary', val3='blob', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test18', db_schema='furu_test', db_table='test18', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
「CHARACTER SET 'binary'」でbinaryにしてみるとやっぱり嫌がられる。
binaryは一通り、おいやですかしらん?
drop table test19 ;
create table test19 (
pkeys varchar(256) not null,
val1 int,
val2 int,
val3 int,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'latin1', ENGINE=InnoDB;
insert into test19 set pkeys='d1', val1=10, val2=20, val3=30, flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test19', db_schema='furu_test', db_table='test19', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
valueのintは特に気にしない…っと。
まぁ「string(8) "10|20|30"」ってreturnになるにはしても。
create table test20 (
pkeys varchar(256) not null,
val1 text,
val2 text,
val3 text,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'latin1', ENGINE=InnoDB;
insert into test20 set pkeys='d1', val1='varchar', val2='binary', val3='blob', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test20', db_schema='furu_test', db_table='test20', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
まぁこれは乗るねぇ。
…あんまり長い文字列だとどうなるんだろう? という疑問があるにはしても。
create table test21 (
pkeys varchar(256) not null,
val1 blob,
val2 blob,
val3 blob,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'latin1', ENGINE=InnoDB;
insert into test21 set pkeys='d1', val1='varchar', val2='binary', val3='blob', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test21', db_schema='furu_test', db_table='test21', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
…あ、乗った。varbinaryは駄目なのに、blobはいいんだ(苦笑
create table test22 (
pkeys varchar(256) not null,
val1 varbinary(128),
val2 blob,
val3 blob,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'latin1', ENGINE=InnoDB;
insert into test22 set pkeys='d1', val1='varchar', val2='binary', val3='blob', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test22', db_schema='furu_test', db_table='test22', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
………blogが乗ったから…と思ったけど、やっぱり駄目なんだよねぇvarbinaryは orz
create table test23 (
pkeys varchar(256) not null,
val1 date,
val2 datetime,
val3 timestamp,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'latin1', ENGINE=InnoDB;
insert into test23 set pkeys='d1', val1='1970-11-25', val2='2014-1-1 11:22:33', val3='2034-1-1 22:33:44', flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test23', db_schema='furu_test', db_table='test23', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
insert into innodb_memcache.containers set name='test23_1', db_schema='furu_test', db_table='test23', key_columns='pkeys', value_columns='val2', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
「name='test23'」はfalse。
「name='test23_1'」は一応戻ってくるんだけど、値がガッツリと文字化けしてる。まぁ「使うな」って事だわなきっと。
create table test24 (
pkeys varchar(256) not null,
val1 blob,
val2 varchar(128),
val3 int,
flags int,
cas_column bigint UNSIGNED,
expire_time_column int,
PRIMARY KEY(pkeys)
) CHARACTER SET 'latin1', ENGINE=InnoDB;
insert into test24 set pkeys='d1', val1='aaa', val2='bbb', val3=999, flags=0, cas_column=0, expire_time_column=0;
insert into innodb_memcache.containers set name='test24', db_schema='furu_test', db_table='test24', key_columns='pkeys', value_columns='val1,val2,val3', flags='flags', cas_column='cas_column', expire_time_column='expire_time_column', unique_idx_name_on_key='PRIMARY';
混ぜると…「string(11) "aaa|bbb|999"」あ、平気だった。
以上、ものっそ長い備忘録w