SET型のカラム(sada_col)を持つテーブル MySQLの練習 free42p


Saturday,June,22,2013 
文字列のSET型のカラム(sada_col)を持つテーブルを作成する練習。
前回のENUM型とにてます。というのはリスト以外の文字入力が出来ないからです。
短縮ビットというのも有るのだが、3番目以降がわかりませんでした。


SET型
SET型では文字列定数をリストします。

mysql> SHOW DATABASES;
mysql> USE sadachika;
mysql> SHOW TABLES;

Tables_in_sadachika
sadachika
sadachika_test
test1
test2
test3
test4

○文字列のSET型のカラムを持つテーブルを作成します。
          mysql> create table test3(t text, b blob);                   *TEXT型とBLOB型だったね 文法をわすれるから書いておくよ
          mysql> create table test3(col ENUM('red','blue','yellow'));   *ENUM型だったね 文法をわすれるから書いておくよ

mysql> create table sadachika_test1(sada_col SET('one','two','three','four','five','定近','サダチカ','さだちか','red','blue','yellow','sadachika','twenty nine'));

                  *↑カラムをsada_colに、型はSET

○「sadachika_test1」テーブルの構造を見る。 カラムの設定が見れます。桁数、NULL値が無い場合の表示方法など 
          mysql> describe test3;             *プログラムの文法を忘れるので書いておきます 
          mysql> show columns from test3;  同じ結果
mysql> describe sadachika_test1;
Field      Type                                                                                                                 Null  Key  Default  Extra
sada_col   set('one','two','three','four','five','定近','サダチカ','さだちか','red','blue','yellow','sadachika','twenty nine')  YES        NULL

   *↑Fieldの名称は任意に設定できるんだね。                                                                                     *↑NULL(データ無し)の使用が可能なんだろうね
             *↑Typeの箇所にSET型の記載があるね


○作成したテーブルの定義を確認してみる。
          mysql> show create table test4\G         *プログラムの文法を忘れるので書いておきます
mysql> show create table sadachika_test1\G
*********** 1. row **************                  *このように長く連なっているのがリストです。これら以外の文字は入力できない。('one','two','three'〜〜〜〜
Table: sadachika_test1                             *SET型のカラムを持つテーブル
Create Table: CREATE TABLE 'sadachika_test1'(
'sada_col' set('one','two','three','four','five','定近','サダチカ','さだちか','red','blue','yellow','sadachika','twenty nine') DEFAULT NULL   *カムラの型に文字コードで一応理解しておくことに。
)ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

           *↑*SET型の文字がある   
    *↑sada_col名称は任意に設定できるんだね。

○入力してみます。
             *いつもの入力はこんな感じだったmysql> insert into test4(col) values('five');        *値はシングルクォーテイションでくくっていたね。今回は少し違うよ データなのか文字かの違いだろうね
insert into sadachika_test1(sada_col) values('定近','サダチカ','さだちか');      *入力失敗シングルクォーテイションでくくったからだね  
insert into sadachika_test1(sada_col) values('定近,サダチカ,さだちか');
insert into sadachika_test1(sada_col) values('さだちか,サダチカ,定近');          *順番を変えて入力
insert into sadachika_test1(sada_col) values('さだちか,定近,サダチカ');          *順番を変えて入力
insert into sadachika_test1(sada_col) values('one','two','three');               *入力失敗シングルクォーテイションでくくったからだね
insert into sadachika_test1(sada_col) values('one,two,three');
insert into sadachika_test1(sada_col) values('five,four,three,two,one');         *順番を変えて入力
insert into sadachika_test1(sada_col) values('three,two,three,one,two');         *重複入力
insert into sadachika_test1(sada_col) values('twenty nine,sadachika,サダチカ,three,blue,five,定近,one,red,さだちか');    *ランダムに入力したよ
insert into sadachika_test1(sada_col) values('null');                *入力失敗シングル付き
insert into sadachika_test1(sada_col) values(null);                  *シングル無し
insert into sadachika_test1(sada_col) values('sadachika');           *小文字
insert into sadachika_test1(sada_col) values('sadachika ');          *後ろに半角スペースを入力
insert into sadachika_test1(sada_col) values(' sadachika ');         *失敗 前後に半角スペースを入力
insert into sadachika_test1(sada_col) values('SADACHIKA');           *大文字
insert into sadachika_test1(sada_col) values('Sadachika');           *頭が大文字
insert into sadachika_test1(sada_col) values(twenty nine);           *失敗 文字の間に半角スペース シングル無しがいけないんだな
insert into sadachika_test1(sada_col) values(Twenty Nine);           *失敗 頭大文字
insert into sadachika_test1(sada_col) values(定近);                  *失敗 漢字
insert into sadachika_test1(sada_col) values('twenty nine');         *文字の間に半角スペース シングル無しがいけないんだな
insert into sadachika_test1(sada_col) values('Twenty Nine');         *頭大文字
insert into sadachika_test1(sada_col) values('定近');                *漢字
insert into sadachika_test1(sada_col) values(1);                     *ビットが割り当てられている
insert into sadachika_test1(sada_col) values(2);                     *ビットが割り当てられている
insert into sadachika_test1(sada_col) values(4);                     *ビットが割り当てられている 3番目以降がわからない
insert into sadachika_test1(sada_col) values(3);                     *ビットが割り当てられている 3番目以降がわからない
insert into sadachika_test1(sada_col) values(5);                     *ビットが割り当てられている 3番目以降がわからない

○リストに含まれていない値を格納するテスト
insert into sadachika_test1(sada_col) values('坂本');    *入力失敗
ERROR 1265 (01000): Data truncated for column 'sada_col' at row 1

insert into sadachika_test1(sada_col) values('green');   *入力失敗
ERROR 1265 (01000): Data truncated for column 'sada_col' at row 1
         
insert into sadachika_test1(sada_col) values('ten');     *入力失敗 
ERROR 1265 (01000): Data truncated for column 'sada_col' at row 1
     
insert into sadachika_test1(sada_col) values('eleven');  *入力失敗
ERROR 1265 (01000): Data truncated for column 'sada_col' at row 1

insert into sadachika_test1(sada_col) values('twelve');  *入力失敗   
ERROR 1265 (01000): Data truncated for column 'sada_col' at row 1


○テーブルの中身の表示 
       mysql> select * from test4;  *忘れやすいのプログラムの文法を書いておきます
mysql> select * from sadachika_test1;
sada_col
定近,サダチカ,さだちか
定近,サダチカ,さだちか
定近,サダチカ,さだちか
one,two,three
one,two,three,four,five
one,two,three
one,three,four,定近,サダチカ,さだちか,red,blue,sadachika,twenty nine
NULL
sadachika
sadachika
sadachika
sadachika
twenty nine
twenty nine
定近
one
two
three
one,two
one,three

○テーブルの中身の表示 プログラムの文法テストいろいろ
       mysql> select t, b from test2;                 *文法を忘れるので書きました。今回は使いません。
       mysql> select col from test4;                  *文法を忘れるので書きました。今回は使いません。
mysql> select sada_col from sadachika_test1;
sada_col
定近,サダチカ,さだちか                                *バラバラに入力したはずが、リストの順番に並んでいる
定近,サダチカ,さだちか                                *バラバラに入力したはずが、リストの順番に並んでいる
定近,サダチカ,さだちか                                *バラバラに入力したはずが、リストの順番に並んでいる
one,two,three
one,two,three,four,five                               *バラバラに入力したはずが、リストの順番に並んでいる
one,two,three                                         *重複入力したものは整理されて順番に並んだ
one,three,four,定近,サダチカ,さだちか,red,blue,sadachika,twenty nine   *バラバラに入力したはずが、リストの順番に並んでいる
NULL
sadachika
sadachika
sadachika
sadachika
twenty nine
twenty nine
定近
one
two
three
one,two
one,three

○テーブルの中身の表示 プログラムの文法テストいろいろ
       mysql> select concat('(',t,')'), concat('(',b,')')from test2;          *文法を忘れるので書きました。今回は使いません。
       mysql> select concat('(',col,')')from test4;                           *文法を忘れるので書きました。今回は使いません。
mysql> select concat('(',sada_col,')')from sadachika_test1;
concat('(',sada_col,')')
(定近,サダチカ,さだちか)
(定近,サダチカ,さだちか)
(定近,サダチカ,さだちか)
(one,two,three)
(one,two,three,four,five)
(one,two,three)
(one,three,four,定近,サダチカ,さだちか,red,blue,sadachika,twenty nine)
NULL
(sadachika)
(sadachika)
(sadachika)
(sadachika)
(twenty nine)
(twenty nine)
(定近)
(one)
(two)
(three)
(one,two)
(one,three)

○テーブルの中身の検索?
       mysql> select concat('(',col,')')from test4 where col=2;          *文法を忘れるので書きました。今回は使いません。
mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='sadachika';
concat('(',sada_col,')')
(sadachika)
(sadachika)
(sadachika)
(sadachika)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='定近';
concat('(',sada_col,')')
(定近)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='定近,サダチカ,さだちか';
concat('(',sada_col,')')
(定近,サダチカ,さだちか)
(定近,サダチカ,さだちか)
(定近,サダチカ,さだちか)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='定近','サダチカ','さだちか';
concat('(',sada_col,')')
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''at line 1

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col=''定近','サダチカ','さだちか'';
concat('(',sada_col,')')
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''at line 1

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='one';
concat('(',sada_col,')')
(one)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col=1;   ビットが割り当りあてられているというが
concat('(',sada_col,')')
(one)


mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='two';
concat('(',sada_col,')')
(two)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col=2;   ビットが割り当りあてられているというが
concat('(',sada_col,')')
(two)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='three';
concat('(',sada_col,')')
(three)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col=4;   ビットが割り当りあてられているというが
concat('(',sada_col,')')
(three)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col=5;   ビットが割り当りあてられているというが
concat('(',sada_col,')')
(one,three)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col=3;   ビットが割り当りあてられているというが
concat('(',sada_col,')')
(one,two)
-------------------------------------------------------------
|○SET型にリストされた文字列定数には順に次のようにビットが割り当てられると説明にある。
|SET('one','two','three','four','five','定近','サダチカ','さだちか',)
|
|'one'     0001 (=1)
|'two'     0010 (=2)
|'three'   0100 (=4)
|'one,two'      (=3)
|'one,three'    (=5)
|
|以降がわかりません。
|ビットってなんですか?
------------------------
mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='サダチカ';
concat('(',sada_col,')')
Empty set (0.00 sec)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='坂本';
concat('(',sada_col,')')
Empty set (0.00 sec)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='one,two,three';
concat('(',sada_col,')')
(one,two,three)
(one,two,three)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='SADACHIKA';
concat('(',sada_col,')')
(sadachika)
(sadachika)
(sadachika)
(sadachika)

mysql> select concat('(',sada_col,')')from sadachika_test1 where sada_col='Sadachika ';
concat('(',sada_col,')')
(sadachika)
(sadachika)
(sadachika)
(sadachika)

○テーブルの中身を表示 
      SELECT * FROM test4 WHERE col = 'one';                  *文法を忘れるので書きました。今回は使いません。
mysql> SELECT * FROM sadachika_test1 WHERE sada_col = 'one';
sada_col
one

mysql> SELECT * FROM sadachika_test1 WHERE sada_col = 'sadachika';
sada_col
sadachika
sadachika
sadachika
sadachika

mysql> SELECT * FROM sadachika_test1 WHERE sada_col = '定近,サダチカ,さだちか';
sada_col
定近,サダチカ,さだちか
定近,サダチカ,さだちか
定近,サダチカ,さだちか

mysql> SELECT * FROM sadachika_test1 WHERE sada_col = NULL;
Empty set (0.00 sec)

○カラムをsada_colに、型はSET。 前回のENUM型のカラムを持つテーブルにもランダムな英数字がています。
型が同じっぽいんですけど?ENGINE=InnoDB DEFAULT CHARSET=utf8ここらあたりが関係してるのかな?

     mysql> select hex(t), hex(b) from test2;                         *文法を忘れるので書きました。今回は使いません。
     mysql> select hex(col) from test4;                               *文法を忘れるので書きました。今回は使いません。
     
mysql> select hex(sada_col) from sadachika_test1;
hex(sada_col)
E5AE9AE8BF91←定近だな........前回のENUM型とにてるんだよな。サーバなの?手入力は厳しい
736164616368696B61←sadachikaだな........
大変な時間がかかりそうなので省略します。


○テーブルの追加を確認する
mysql> SHOW TABLES;
Tables_in_sadachika
sadachika
sadachika_test
sadachika_test1   *追加されたね
test1
test2
test3
test4                 



* 参考にしたサイトは→ こちら です。

これは赤色の文字例です。

これは青色の文字例です。