2009年3月9日 星期一

[CMake] Import/link a static library

還是習慣偷懶不看 document ,害我花了半天時間!看了許多教學文件,似乎對使用額外的 static lib 並沒有著墨太多?感覺 cmake 因為太方便了,以至於整個專案都可以全部從 source code 慢慢地編出來嗎?


在此做個簡單的筆記!關於想將自己私下開發的 static lib 引進 cmake 使用。假設目前有一個開發好的 static lib ,其名為 libtest_lib.a 並擺在 /path/mylib/libtest_lib.a 。


在 cmake 使用,需用兩行敘述:


ADD_LIBRARY ( test_lib STATIC IMPORTED )


SET_PROPERTY ( TARGET test_lib PROPERTY IMPORTED_LOCATION /path/mylib/libtest.a )


最後,在使用上才可以:


TARGET_LINK_LIBRARIES ( demo_test test_lib )


原先是打算想擺在相對路徑的,目前尚未試出來。


另外,若有 error: xxx.h: No such file or directory  請記得用 INCLUDE_DIRECTORIES 加好 static lib 的 header file ,而出現 /usr/bin/ld: cannot find -lxxx_staitc_lib 則是用上頭的解法。


對於想使用相對路徑的方式:


目錄結構:


MyProject
- lib/  (擺放相關 lib 的位置)
- src/
- CMakeLists.txt


CMakeLists.txt:


PROJECT ( "MyProject" )
SET ( EXECUTABLE_OUTPUT_PATH ${MyProject_BINARY_DIR}/bin )
SET ( LIBRARY_OUTPUT_PATH ${MyProject_BINARY_DIR}/lib )
INCLUDE_DIRECTORIES ( include )
ADD_LIBRARY ( myprojectlib src/myproject.c )
ADD_LIBRARY ( otherlib STATIC IMPORTED )
SET_PROPERTY ( TARGET otherlib PROPERTY IMPORTED_LOCATION ${MyProject_SOURCE_DIR}/lib/libotherlib.a )
ADD_EXECUTABLE ( myproject_tool src/myproject_tool.c )
TARGET_LINK_LIBRARIES ( myproject_tool myprojectlib otherlib )


解法可以用善用 ${MyProject_SOURCE_DIR} 資訊來指定。


參考資料:CMake 2.6 Documentation - add_library & CMake 2.6 Notes - Importing_Targets


2009年3月5日 星期四

[SQL] MySQL 一行指令 複製 A Table 的值對應至 B Table 中

一切動作運行之前,請先備份資料庫!


假設有兩個 table ,依序為 a 跟 b。目的想透過一行 SQL 指令將 a table 中的 value 數值取出並存至 b table 中對應的 value。

















a
IDValue

















b
IDValue


如果 B 裡頭的 ID 皆出現在 A 裡頭,可用:


UPDATE `b` as B SET B.Value = (
   SELECT A.Value
   FROM `a` as A
   WHERE A.ID = B.ID
);


假設 B 裡出現某個 ID 是 A 沒有的,那上述的動作將會清掉 B 該 ID 在 Table 中原先的數值!要小心處理,若要避免這個現象,需改成:


UPDATE `b` as B , `a` as A SET B.Value = (
   SELECT AA.Value
   FROM `a` as AA
   WHERE AA.ID = B.ID
) where A.ID = B.ID ;


 


2009年3月3日 星期二

MySQL的重要語法

From http://www.hmes.kh.edu.tw/~jona/redhat/mysqlphp/mysqlsyntax.htm


 


MySQL的重要語法


[帳號與權限] [資料庫/資料表/欄位的操作] [
錄的操作
] [資料的
輸出
]


一、帳號與權限


設定 root 和其他 user 的密碼



  • mysqladmin -u root password '新密碼'

  • mysqladmin -u root -p

  • Enter password:    此時再輸入密碼(建議採用)

  • use mysql;

    mysql> UPDATE user SET password=password('新密碼') where user='root'; 

      只改 root 的密碼,如果沒有用 where ,則表示改全部 user 的密碼

  • mysql> FLUSH PRIVILEGES; 在 mysql
    資料庫內,一定要用 flush 更新記憶體上的資料


刪除空帳號



  • mysql> DELETE FROM user WHERE User = '';

  • mysql> FLUSH PRIVILEGES;
     


建立新帳號



  • mysql> GRANT 權限 ON 資料庫或資料表 TO 使用者
    IDENTIFIED BY '密碼';


      權限

       

      資料庫或資料表

       *.* 所有資料庫裡的所有資料表

       * 預設資料庫裡的所有資料表

       資料庫.* 某一資料庫裡的所有資料表   

       資料庫.資料表 某一資料庫裡的特定資料表

       資料表  預設資料庫裡的某一資料表


設定/修改權限  



  • 用 root 登入 MySQL

     
    mysqladmin -u root -p

     Enter password:   

  • mysql> GRANT all ON db35.* TO
    s35@'localhost' IDENTIFIED BY 's35';


       把 db35 這個資料庫(含其下的所有資料表),授權給 s35,從 localhost 上來,密碼為s35
     

  • mysql> GRANT all ON *.* 
    把所有資料庫及資料表授權給別人,太危險了!

     

  • mysql> GRANT all??? ON www.* TO
    '*'@'*' IDENTIFIED BY '';

       
    把 www 這個資料庫(含其下的所有資料表),授權給 任何機器任何人,無密碼(通常給不特定人士使用)
     

  • mysql> FLUSH PRIVILEGES;  
    (最後一定要強迫更新權限)


 


二、資料庫/資料表/欄位的操作


建立資料庫 CREATE DATABASE 資料庫名;

語法:CREATE
DATABASE db_name


使用資料庫 USE
資料庫名;

語法:USE
db_name


刪除資料庫 DROP DATABASE 資料庫名;

語法:DROP
DATABASE [IF EXISTS] db_name


 

建立資料表

 CREATE TABLE 資料表名 (欄位1 資料型態, 欄位2 資料型態,
......);


語法:

CREATE TABLE [IF NOT EXISTS] tbl_name (create_definition,...)
[table_options] [select_statement]


例:

craete database basic;

use basic;

create table basic(

  no char(4)

  name char(10)

  id char(10));


create_definition:

  col_name type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT]

           
[PRIMARY KEY] [reference_definition]

  or    PRIMARY KEY (index_col_name,...)

  or    KEY [index_name] KEY(index_col_name,...)

  or    INDEX [index_name] (index_col_name,...)

  or    UNIQUE [INDEX] [index_name]
(index_col_name,...)

  or    [CONSTRAINT symbol] FOREIGN KEY index_name
(index_col_name,...)

           
[reference_definition]

  or    CHECK (expr)


資料結構(type):





















































































































資料型態說明
TINYINT有符號的範圍是-128127
無符號的範圍是0255
SMALLINT有符號的範圍是-3276832767
無符號的範圍是065535
MEDIUMINT有符號的範圍是-83886088388607
無符號的範圍是016777215
INT有符號的範圍是-21474836482147483647
無符號的範圍是04294967295
INTEGERINT的同義詞。
BIGINT有符號的範圍是-9223372036854775808到
9223372036854775807,無符號的範圍是0到18446744073709551615。
FLOAT單精密浮點數字。不能無符號。允許的值是-3.402823466E+38到-
1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。
DOUBLE雙精密)浮點數字。不能無符號。允許的值是-
1.7976931348623157E+308到-2.2250738585072014E-308、
0和2.2250738585072014E-308到1.7976931348623157E+308。
DOUBLE PRECISIONDOUBLE的同義詞。
REALDOUBLE的同義詞。
DECIMALDECIMAL值的最大範圍與DOUBLE
同。
NUMERICDECIMAL的同義詞。
DATE日期。支援的範圍是'1000-01-01'到'9999-12-31'。
DATETIME日期和時間組合。支援的範圍是'1000-01-01
00:00:00'
'9999-12-31 23:59:59'
TIMESTAMP時間戳記。範圍是'1970-01-01
00:00:00'到2037年的某時。
TIME一個時間。範圍是'-838:59:59''838:59:59'
YEAR2或4位數字格式的年(內定是4位)。允許的值是1901到2155。
CHAR固定長度,1 ~ 255個字元。
VARCHAR可變長度,1 ~ 255個字元。

TINYBLOB



TINYTEXT最大長度為255(2^8-1)個字符。

MEDIUMBLOB



MEDIUMTEXT最大長度為16777215(2^24-1)個字符。

LONGBLOB



LONGTEXT最大長度為4294967295(2^32-1)個字符。
ENUM一個ENUM最多能有65535不同的值。
 
SET一個SET最多能有64個成員。



index_col_name:

        col_name [(length)]


reference_definition:

        REFERENCES tbl_name
[(index_col_name,...)]

                  
[MATCH FULL | MATCH PARTIAL]

                  
[ON DELETE reference_option]

                  
[ON UPDATE reference_option]


reference_option:

        RESTRICT | CASCADE | SET
NULL | NO ACTION | SET DEFAULT


table_options:

        type = [ISAM | MYISAM |
HEAP]

or      max_rows = #

or      min_rows = #

or      avg_row_length = #

or      comment = "string"

or      auto_increment = #

select_statement:

        [ | IGNORE | REPLACE] SELECT
...  (Some legal select statement)


刪除資料表 DROP TABLE 資料表名;

語法:DROP
TABLE [IF EXISTS] tbl_name [, tbl_name,...]


改變資料表結構(新增/刪除欄位、建立/取消索引、改變欄位資料型態、欄位重新命
名)


語法:

ALTER [IGNORE] TABLE tbl_name alter_spec
[, alter_spec ...]


alter_specification:

       
ADD [COLUMN] create_definition [FIRST | AFTER column_name ]


  or    ADD INDEX
[index_name] (index_col_name,...)


  or    ADD PRIMARY
KEY (index_col_name,...)


  or    ADD UNIQUE
[index_name] (index_col_name,...)


  or    ALTER
[COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}


  or    CHANGE
[COLUMN] old_col_name create_definition


  or    MODIFY
[COLUMN] create_definition


  or    DROP
[COLUMN] col_name


  or    DROP PRIMARY
KEY


  or    DROP INDEX
key_name


  or    RENAME [AS]
new_tbl_name


  or    table_option


範例:

 欄位重新命名

 mysql> ALTER TABLE t1 CHANGE a b INTEGER;


  將資料表 t1 欄位 a 改名為 b (其資料型態是 integer)

 改變欄位資料型態

 mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT
NULL;


 mysql> ALTER TABLE t1 MODIFY b BIGINT NOT
NULL;


  將資料表 t1 欄位 b 的資料型態改為 bigint not null 


 mysql> CREATE TABLE t1 (a
INTEGER,b CHAR(10)); 


 mysql> ALTER TABLE t1 RENAME t2;


  將資料表 t1 改名為 t2

 mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c
CHAR(20);

  將資料表 t2 欄位 a 資料型態由 integer 改為 tinyint not null
,欄位 b 改名為 c 資料型態改為 char(20)


 mysql>
ALTER TABLE t2 ADD d TIMESTAMP;


  在資料表 t2 增加新欄位 d 資料型態是 timestamp

 mysql> ALTER TABLE t2 ADD INDEX (d), ADD
PRIMARY KEY (a);


  在資料表 t2 ,對 d 欄位做索引,並以欄位 a 作為主索引鍵

 mysql> ALTER TABLE t2 DROP COLUMN c;

  刪除欄位 c

  mysql> ALTER TABLE t2 ADD c INT
UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (c);


  新增欄位 c,並做索引(做索引的欄位必須為 not null )


資料表最佳化 OPTIMIZE
TABLE 資料表名


語法:OPTIMIZE TABLE
tbl_name


 欄位長度有變動、刪除大量資料,都應進行資料表最佳化


三、紀錄的操作


插入一筆或多筆紀錄 INSERT
INTO 資料表(欄位1,欄位2,......)
VALUES(值1,值2,......), (值1,值2,......), ........


  (MySQL 3.22.5
以後可插入多筆記錄)


語法:

    INSERT [LOW_PRIORITY |
DELAYED] [IGNORE]


        [INTO] tbl_name
[(col_name,...)]

        VALUES
(expression,...),(...),...

or  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]

        [INTO] tbl_name
[(col_name,...)]

        SELECT ...

or  INSERT [LOW_PRIORITY | DELAYED] [IGNORE]

        [INTO] tbl_name

        SET col_name=expression,
col_name=expression, ...

範例:

 mysql> INSERT INTO tbl_name (col1,col2)
VALUES(15,col1*2);


  不可寫成

 mysql> INSERT INTO tbl_name (col1,col2)
VALUES(col2*2,15);


  因為:欄位 col1 的值先填入後,才可以計算欄位 col2


從檔案讀入資料

語法:

 LOAD DATA [LOCAL] INFILE
'file_name.txt' [REPLACE | IGNORE]


    INTO TABLE tbl_name


    [FIELDS

       
[TERMINATED BY '\t']
   每一欄位以某字元分開(內定是 tab)

       
[OPTIONALLY] ENCLOSED BY "]
  每一欄位以某字元括住(內定是不使用括號)

       
[ESCAPED BY '\\' ]]
    

    [LINES
TERMINATED BY '\n']  
設定換行的字元(內
定是 \n)

    [IGNORE number LINES]
   忽略最前面幾行(最前面幾筆記錄不抄進來)


    [(col_name,...)]


範例:

 mysql> USE db1;

 mysql> LOAD DATA INFILE "./data.txt" INTO TABLE db2.my_table;

  從目前 MySQL 目錄讀入 data.txt

 mysql> LOAD DATA INFILE "./88.txt" INTO TABLE TEACHER FIELDS
TERMINATED BY ' ' ;

  從目前 MySQL 目錄(我的在 /var/lib/mysql )讀入 data.txt ,每一欄位以 空白 分開

 mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata
(col1,col2,...);

  只將 persondata.txt 裡某些欄位的資料抓過來 


刪除紀錄 DELETE [LOW-PRIORITY]
FROM 資料表名 WHERE 條件 [LIMIT rows]

語法:

 DELETE [LOW_PRIORITY] FROM tbl_name

    [WHERE where_definition] [LIMIT rows]

  LOW-PRIORITY 是等到沒有用戶端使用時再刪

  LIMIT rows 限制刪除紀錄的筆數

範例:

 mysql> DELETE FROM 資料表名;

  刪除所有紀錄

 mysql> DELETE FROM 資料表名 WHERE 1>0;

  刪除所有紀錄,但速度較慢,方便在螢幕上看


更新一筆紀錄 (語法與 INSERT 相同)

 REPLACE INTO 資料表(欄位1,欄位2,......)
VALUES(值1,值2,......)


語法:

REPLACE [LOW_PRIORITY | DELAYED]

        [INTO]
tbl_name [(col_name,...)]


        VALUES
(expression,...)


or  REPLACE [LOW_PRIORITY | DELAYED]

        [INTO]
tbl_name [(col_name,...)]


        SELECT
...


or  REPLACE [LOW_PRIORITY | DELAYED]

        [INTO]
tbl_name


        SET
col_name=expression, col_name=expression,...


更新多筆紀錄

語法:

UPDATE [LOW_PRIORITY] tbl_name SET
col_name1=expr1,col_name2=expr2,...     [WHERE
where_definition]

  如果沒有設定 WHERE 條件,則整個資料表相關的欄位都更新

範例:

 mysql> UPDATE persondata SET age=age+1;

  將資料表 persondata 中,所有 age 欄位都加 1

 mysql> UPDATE persondata SET age=age*2, age=age+1;

  將資料表 persondata 中,所有 age 欄位都*2,再加 1


四、資料的輸出


SELECT


語法:

 SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [DISTINCT | ALL]

    select_expression,...

    [INTO OUTFILE 'file_name' export_options]

    [FROM table_references

        [WHERE where_definition]

        [GROUP BY col_name,...]

        [HAVING where_definition]

        [ORDER BY {unsigned_integer
| col_name} [ASC | DESC] ,...]

        [LIMIT [offset,] rows]

        [PROCEDURE procedure_name] ]


範例:



排序輸出


select * from 資料表名 order by
欄位名1,欄位名2,欄位名3...... 


反向排序輸出


select * from 資料表名 order by 欄位名1,欄位名2,欄位名3...... desc


 


mysql> select concat(last_name,',
',first_name) AS full_name 



      from mytable ORDER BY full_name;







 mysql> select t1.name, t2.salary from employee AS t1, info AS t2



           where
t1.name = t2.name;



  顯示資料庫 employee(別名 t1) 裡,資料表 t1 的欄位 name 和 資料表 t2 的欄位 salary 當.....



 mysql> select t1.name, t2.salary from employee t1, info
t2           where
t1.name = t2.name;







 mysql> select college, region, seed from tournament



           ORDER BY
region, seed;



 mysql> select college, region AS r, seed AS s from tournament



           ORDER BY
r, s;



 mysql> select college, region, seed from tournament



           ORDER BY
2, 3;







 mysql> select col_name from tbl_name HAVING col_name > 0;







 mysql> select col_name from tbl_name WHERE col_name > 0;







 mysql> select user,max(salary) from users



           group by
user HAVING max(salary)>10;







 mysql> select user,max(salary) AS sum from users



           group by
user HAVING sum>10;







 mysql> select * from table LIMIT 5,10;  # Retrieve rows 6-15







 mysql> select * from table LIMIT 5;     #
Retrieve first 5 rows



  •  


在命令列下進行批次處理:

shell> mysql -h host -u user -p < batch-file

Enter password: ********









































Type Bytes From To
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807

 





























Column type ``Zero'' value
DATETIME '0000-00-00 00:00:00'
DATE '0000-00-00'
TIMESTAMP 00000000000000 (length depends on display size)
TIME '00:00:00'
YEAR 0000

 





































Column type Display format
TIMESTAMP(14) YYYYMMDDHHMMSS
TIMESTAMP(12) YYMMDDHHMMSS
TIMESTAMP(10) YYMMDDHHMM
TIMESTAMP(8) YYYYMMDD
TIMESTAMP(6) YYMMDD
TIMESTAMP(4) YYMM
TIMESTAMP(2) YY

 






























Type Max.size Bytes
TINYTEXT or TINYBLOB 2^8-1 255
TEXT or BLOB 2^16-1 (64K-1) 65535
MEDIUMTEXT or MEDIUMBLOB 2^24-1 (16M-1) 16777215
LONGBLOB 2^32-1 (4G-1) 4294967295

 








































Value CHAR(4) Storage required VARCHAR(4) Storage required
'' ' ' 4 bytes '' 1 byte
'ab' 'ab ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

 





























Value Index
NULL NULL
"" 0
"one" 1
"two" 2
"three" 3

 





























































Other vendor type MySQL type
BINARY(NUM) CHAR(NUM) BINARY
CHAR VARYING(NUM) VARCHAR(NUM)
FLOAT4 FLOAT
FLOAT8 DOUBLE
INT1 TINYINT
INT2 SMALLINT
INT3 MEDIUMINT
INT4 INT
INT8 BIGINT
LONG VARBINARY MEDIUMBLOB
LONG VARCHAR MEDIUMTEXT
MIDDLEINT MEDIUMINT
VARBINARY(NUM) VARCHAR(NUM) BINARY

 





























































Column type Storage required
TINYINT 1 byte
SMALLINT 2 bytes
MEDIUMINT 3 bytes
INT 4 bytes
INTEGER 4 bytes
BIGINT 8 bytes
FLOAT(X) 4 if X <= 24 or 8 if 25 <= X <= 53
FLOAT 4 bytes
DOUBLE 8 bytes
DOUBLE PRECISION 8 bytes
REAL 8 bytes
DECIMAL(M,D) M+2 bytes if D > 0, M+1 bytes
if D = 0 (D+2, if M < D)
NUMERIC(M,D) M+2 bytes if D > 0, M+1 bytes
if D = 0 (D+2, if M < D)

 





























Column type Storage required
DATE 3 bytes
DATETIME 8 bytes
TIMESTAMP 4 bytes
TIME 3 bytes
YEAR 1 byte

 









































Column type Storage required
CHAR(M) M bytes, 1 <= M <= 255
VARCHAR(M) L+1 bytes, where L <= M and 1
<= M <= 255
TINYBLOB, TINYTEXT L+1 bytes, where L < 2^8
BLOB, TEXT L+2 bytes, where L < 2^16
MEDIUMBLOB, MEDIUMTEXT L+3 bytes, where L < 2^24
LONGBLOB, LONGTEXT L+4 bytes, where L < 2^32
ENUM('value1','value2',...) 1 or 2 bytes, depending on the number of enumeration values
(65535 values maximum)
SET('value1','value2',...) 1, 2, 3, 4 or 8 bytes, depending on the number of set members
(64 members maximum)






 


SQLite 簡介 (1)

From http://support.oss.org.tw/?q=node/157


 


介紹

   
資料庫在處理大量的資料上是很必要的,但如果資料固定且量不多,或是資料庫只會在單機上使用,且沒有讓多人使用的需求的話,就不一定需要特別架一個資料庫
系統;因此,可以使用類似 SQLite 這樣的嵌入式資料庫(embedded SQL database)。


    SQLite 與其他一般資料庫差異不大,一般的 SQL-92
語法都能夠使用,而且不需要建立一個資料庫系統,要使用的時候,只要在編譯程式的時候將 SQLite 程式庫一起編入就可以使用。另外,SQLite
的資料庫(database)都是以單一檔案的形式存於磁碟中,不需要再安裝資料庫伺服器軟體,所以要把資料庫複製或建立在你的電腦上是相單簡單快速。

SQLite 是一個很小的 C 語言程式庫,且本身就完全包含資料庫引擎的功能,而且可以嵌入至其他程式中,完全不用額外的設定。其特性如下:



  • 支援ACID (Atomic, Consistent, Isolated, Durable) transaction。

  • Zero-configuration:無須管理者的設定及管理。

  • 支援大部分SQL92的語法。

  • 資料庫存在於一個單一的檔案中。

  • 資料庫系統所在機器的位元組順序(Byte order)無關。

  • 支援大小至2 terabytes (2^41 bytes)。

  • 記憶體需求小:小於3萬行的C語言程式碼。小於250KB的程式空間。

  • 大部分的資料庫操作皆快於一般資料庫系統。

  • 簡單易用的API。

  • 支援TCL。也有其他語言的支援可用。

  • 註解詳細的程式碼,以及超過90%的測試。

  • 程式庫自己包含完整的功能,無須其他額外的程式或程式庫。

  • 為public domain,可免費使用。

  • serverless

  • cross-platform - 使用unicode

  • 不會進行data type檢查


 


安裝


for Linux(rpm)


I、下載 SQLite

# wget http://www.sqlite.org/sqlite-3.5.4.tar.gz

2、解壓縮與編譯

# tar zxvf sqlite-3.5.4.tar.gz

# cd sqlite-3.5.4

# ./configure

# make

# make install

ps.若make的時候有發生找不到tcl相關的library時,可以利用下列指令:

# ./configure --disable-tcl --prefix=/usr/local/sqlite-3.3.5

亦或者下載 sqlite 與 tcl 相關的 library 即可:

# apt-get install libsqlite3-tcl


for linux(套件管理程式安裝)


可以利用 apt-get(Ubuntu/Debian)或 yum(Fedora)來直接下載,

# apt-get install sqlite

 

若 SQLite 要與 PHP 搭配使用,則需要為 PHP 特別安裝套件,可利用各個 distros 的套件管理軟體來安裝(以Ubuntu為例):



  • for PHP4:


            # apt-get install php4-sqlite



  • for PHP5:


            # apt-get install php5-sqlite


for Windows


若要下載命令列模式的 SQLite 程式來存取與修改 SQLite 資料庫,可以至(http://www.sqlite.org/download.html)下載預先編譯過的程式。


 for PHP 4:


1、到這裡(http://pecl4win.php.net/ext.php/php_sqlite.dll)下載 php_sqlite.dll

2、php.ini 加上 extension=php_sqlite.dll

3、重新啟動 Web Server 即可。


forPHP 5:


PHP 5 已經包含 SQLite 模組了,所以只需要載入模組即可。

修改 php.ini,將 ;extension=php_sqlite.dll 將前面的分號去掉。

最後一樣重新啟動 Web Server 即可。


如何使用sqlite(command-line)


    以下我們就對建立資料庫、建立資料表、新增資料、查詢資料、更改資料、移除資料、sqlite 命令列選項等幾個項目做簡單的介紹。

1、建立資料庫檔案

用 sqlite 建立資料庫的方法很簡單,只要在 shell 下鍵入:

# sqlite db_name

 

如果目錄下沒有 db_name,sqlite 就會建立這個資料庫。

進入了sqlite之後,會看到以下文字:

SQLite version 2.8.17

Enter ".help" for instructions

sqlite>

 

這時如果使用.help可以取得求助,.quit則是離開

所有的SQL指令都是以分號(;)結尾的。如果遇到兩個減號(--)則代表註解,sqlite 會略過去。


2、建立資料表(table)


假設我們要建一個名叫 tbl 的資料表,只要鍵入以下指令就可以了:

sqlite > create table tbl(one, two);

 

這樣我們就建立了一個名叫 tbl 的資料表,裡面有 one、two 兩個欄位。

 

create table指令的語法為:

create table table_name(field1, field2, field3, ...);

 

table_name 是資料表的名稱,fieldx 則是欄位的名字。sqlite 的欄位不會檢查是屬於哪一種資料型態:sqlite的欄位可以儲存任何東西:文字、數字、大量文字(blob),它會在適時自動轉換。

 

3、加入一筆資料

接下來我們要加入資料了,語法為:

insert into table_name values(data1, data2, data3, ...);

例如

insert into tbl values ('hello!', 10);

insert into tbl values ('goodbye’, 20);

 

如果該欄位沒有資料,我們可以填NULL。


4、查詢資料


利用 SQL 語法裡的 select :


select columns from table_name where expression;

 

最常見的用法,當然是倒出所有資料庫的內容:

select * from tbl;

 

如果資料太多了,我們或許會想限制筆數:

select * from tbl limit 10;

 

有時候我們只想知道資料庫一共有多少筆資料:

select count(*) from film;


5、如何更改或刪除資料


瞭解 select 的用法非常重要,因為要在 sqlite 更改或刪除一筆資料,也是靠同樣的語法。

 

例如有一筆資料打錯了,可利用這樣的指令來修改:

update tbl set one = 'hello!' where one='hollo!';

 

就會把one欄位裡,被打成 hollo! 的那筆(或多筆)資料,改回成hello!。

 

其他 sqlite 的特別用法


1、sqlite 可以在 shell 底下直接執行命令:


sqlite3 foo.db "select * from tbl;"


 


2、資料庫備份:


sqlite3 ur_db.db ".dump" > output.sql




$ echo '.dump' | sqlite ur_db.db | gzip -c > ur_db.dump.gz


利用輸出的資料,可以建立一個相同的資料庫(其實就是標準的SQL資料庫備份):


sqlite3 film.db < output.sql



$ zcat ex1.dump.gz | sqlite3 ex2

 

3、查詢資料庫的 schema

資料庫的 schema 是特別存於名為 sqlite_master 的資料表,可利用 "SELECT" 指令來查詢,如下所示:

 

$ sqlite3 db_name

SQlite vresion 2.817

Enter ".help" for instructions

sqlite> select * from sqlite_master;

type = table

name = tbl

tbl_name = tbl

rootpage = 3

sql = create table tbl(title, length)

sqlite>

 

4、更改輸出的格式

sqlite 能夠將查詢的結果以8種不同的格式輸出(csv、column、html、insert、line、tabs、tcl),你可以利用指令
"mode" 來改變輸出格式,預設的格式為 list   ,在這個模式下,查詢的結果都是一行一行列出,而預設的分隔符號為 "|" ,如下所示:

 

sqlite> .mode list

sqlite> select * from tbl;

aaa|232

bbb|454

 

你也可以利用指令 ".separator" 來改變分隔符號,例如:

 

sqlite> .separator ", "

sqlite> select * from tbl;

aaa, 232

bbb, 454

sqlite>

 

在 "line" 模式中,每一個欄位都會獨自與一行顯示出來,而每一筆資料會以一個空行來分隔,如下所示:

 

sqlite> .mode line

sqlite> select * from tbl;

title = aaa

length = 232



title = bbb

length = 454

sqlite>

 

在 column 模式中,每一筆資料都會顯示於獨立的一列,並且以欄位來分隔,如下所示:

 

sqlite> .mode column

sqlite> select * from tbl;

title length

---------- ----------

aaa 232

bbb 454

sqlite>

 

另外一個有用的模式為 "insert",此模式的輸出格式類似於 SQL 語法中的 INSERT 格式,可用於日後要輸入資料於其他資料庫中:

 

sqlite> .mode insert

sqlite> select * from tbl;

INSERT INTO table VALUES('aaa',232);

INSERT INTO table VALUES('bbb',454);

sqlite>

 

最後一個輸出模式為 "html",此模式下 sqlite 會將查詢結果輸出為類似 XHTML 表格,如下所示:

 

sqlite> .mode html

sqlite> select * from tbl;

<TR><TH>title</TH><TH>length</TH></TR>

<TR><TD>aaa</TD>

<TD>232</TD>

</TR>

<TR><TD>bbb</TD>

<TD>454</TD>

</TR>

sqlite>

 

查詢資料庫的 schema

sqlite   提供很多方便且有用的指令來查詢資料庫的 schema:

列出資料庫中的資料表,利用 ".tables":

 

sqlite> .tables

tbl

sqlite>

 

".schema" 指令顯示出原來建立資料表與索引的指令,可以用於重建目前的資料庫用:

 

sqlite> .schema

create table tbl(title, length);

sqlite>

 

這邊就先介紹 SQLite 到這邊,我將會在下一篇說明如何在 PHP 上使用 SQLite。


2009年3月1日 星期日

[懷舊] 超級任天堂 / 超任 / SFC 遊戲 就是最好的記憶

超級任天堂


幾週前,由於買了電視盒後,老妹突然想嘗試玩玩塵封已久的電機遊戲器 - 超級任天堂!可惜的,經嘗試後,仍然無法正常使用,開機後沒有任何畫面。算起來應該有 17 年了吧?那台遊戲機在我國小二年級吵著老爸買的,印象中當時光遊戲主機一台可要價 3800 ~ 4200 元!可真是小時不懂事啊。



當時吸引的、流行的,就屬快打炫風2這款遊戲了!當時卡帶的價也不便宜,一片可也是動輒上千元的!因此,還有個風氣,那就是跟店家交換卡代。我記得第一片卡帶是快打炫風2沒錯,但手頭上的卡帶似乎已經不是最初的那幾片了。這股潮流也隨著磁碟機的出現而沒落。目前家中僅五片卡帶,分別為快打炫風2加強版、餓狼傳說、幽遊白書魔界傳、雙截龍、忍者龜,其中雙截龍我確定是在萬客隆買的(又是個兒時的名詞),忍者龜可能是在台中的玩具反斗城吧!回想起來,當時跟店家換片時,依卡帶價貼錢換。但我不記得若是將貴的卡帶換成便宜的時,店家是否會誠心地退額?呵呵,或許店家還會騙你,每次都至少酌收手序費哩!怎樣算還是店家賺啊。


PICT0458


然而,不懂事的年代並沒有那麼快地過去,大概兩年左右,又敗了一台攔截者磁碟機,我印象中當時一台可貴到 6000 元!隨著磁片的盛行,遊戲的費用就慢慢變成一個遊戲 50 ~ 100 元不等,看要用幾片 1.44 MB 的磁片裝,我記得當時一片是要 50 元,而遊戲有時需要兩片以上,那就代表要花 100 元買一款遊戲。當時磁碟機可還有容量的限制!我記得我家這台應該只有 16MB 而已,最多只能玩 2 片磁片囉,若要玩到三片磁片的遊戲,還得擴充記憶體至 24MB !我印象中好像是這樣,所以沒有玩三國志4吧?



除了上述的裝備外,還買過一個無線的,還有連打的按鍵,只是我還是喜歡超任原廠的按鍵手把,薄薄的比較佳,就連現在常用的 PS 手把,我也不是很喜歡,不曉得現在還會不會存在將超任手把轉接成 USB 的呢?在這之後,除了磁片外應該就沒在花錢買東西了,只是遊戲機也隨著電腦的普及而慢慢地退出啦,我記得我好像是小六開始玩 PC Game 的,當時最熱的遊戲正是仙劍奇俠傳,只是我並沒玩過,倒是印象較深的是國一玩叫炎龍騎士團2的遊戲,直到國二時,我印象中我都還有在玩超任遊戲機,只是次數越來越少了,並且隨著升學壓力而慢慢退場。粗算所花的錢,可能有破兩萬!


這兩天,心血來潮想把過去玩的遊戲都找出來,昨天花了近三小時找得差不多了!只剩兩款遊戲沒找到,分別叫超真實麻將和鐵拳戰士,這種名字可能也都只是當時店家取的吧。不過算起我也已經找到九成遊戲囉!算了一算,還真的花了不少錢。至於找遊戲的方式,請參考這個關鍵字來 Google :超任 遊戲 下載,結果的第一項就是教你怎樣下載遊戲了 XD 目前嘗試的結果,遊戲應該是沒問題都找得到,唯一的缺點是遊戲名稱以及上頭附的英文中文對照表可能不一定正確,我大概有2~3款遊戲跟上頭敘述的不一樣,所幸的,我都找到了,沒找到的只是沒有衝勁再挖吧,哈。在此列一下找到的英中對照表


對打遊戲


快打炫風2-加強版 Street Fighter II Turbo - Hyper Fighting


幽遊白書2 Yuu Yuu Hakusho 2 - Kakutou no Shou (該網站的圖似乎擺成 1 的)


幽遊白書-魔界最強列傳 Yuu Yuu Hakusho Final - Makai Saikyou Retsuden


七龍珠-超武鬥傳2 Dragon Ball Z - Super Butouden 2


七龍珠-超武鬥傳3 Dragon Ball Z - Super Butouden 3


餓狼傳說 Garou Densetsu - Shukumei no Tatakai


龍虎拳 Art of Fighting


單人遊戲


2020 Super Baseball


三國誌三-中文版 Sangokushi III


小叮噹-大雄與妖精王國 Doraemon 2 - Nobita no Toys Land Daibouken


天使彈平/火焰鬥球兒-彈平 Honoo no Doukyuuji - Dodge Danpei


超悟空傳-突激篇 Dragon Ball Z - Super Gokuuden Kakusei Hen


侏儸紀公園 Jurassic Park


超真實麻將 Super
Real Mahjong PIV


雙人遊戲


大盜伍佑衛門2 Ganbare Goemon 2 - Kiteretsu Shougun Magginesu


初代熱血硬派 Shodai Nekketsu Kouha Kunio-kun


熱血硬派-國雄之輓歌 Shin Nekketsu Kouha - Kunio-tachi no Banka


超級魂斗羅 Super Probotector - The Alien Rebels


鐵血指揮官/鋼鐵戰士 Iron Commando


龍王 King of Dragons


NBA Jam


戰鬥原始人3 Joe & Mac 3 - Lost in the Tropics


美少女戰士R Bishoujo Senshi Sailor Moon R


超級雙截龍 Super Double Dragon


音速俠2/音速快擊手2 Sonic Blast Man II


忍者龜 Teenage Mutant Ninja Turtles - Turtles in Time


其他是透過模擬器才玩過的遊戲


閃電霹靂車 Shinseiki GPX - Cyber Formula


三國志英傑傳 Sangokushi Eiketsuden


太空戰士6 Final Fantasy III (這款還有簡體版喔)


灌籃高手 From TV Animation Slam Dunk - SD Heat Up!!


原先的空白是拿來貼圖的,但因為版權關係,後來決定拿掉了,但只要有上頭遊戲的英文名稱,應該就是非常夠用的資訊囉!以上就是我所接觸過的遊戲!大部分都有破關,只有幾款故事很長或是不太會玩的遊戲才沒破,如太空戰士六、侏儸紀公園、餓狼傳說、閃電霹靂車、三國志英傑傳(PC破過)等,至於買過攻略的,僅有超悟空傳-突激篇。


超級任天堂是我家的第二台電視遊樂器,同時也是最後一台,第一台當然就是紅白機囉!這些回憶,相對於別人正風行著時下的救國團活動,看起來可真的是電視兒童,整體上卡通跟電玩幾乎佔據了五成國小的回憶。特別是寒暑假的長假時間。至於會不會有什麼後悔?只能說慶幸自己的家庭,在國小時期我還玩過泥巴、與街狗互動、烤蕃薯、抓田間水溝的魚、蛙等,說起來還是很豐富的。


如果需要查詢其他遊戲中文英文名稱的對照,可以再看看這篇:超任 超級任天堂 SFC 中英對照,算是暫存網路上找到的對照表。