Set cn = CreateObject("ADODB.Connection")
          strCn = "driver=MySQL ODBC 5.1 Driver;" & _
                  "server=192.168.1.40;" & _
                  "database=bingotest;" & _
                  "uid=ks;" & _
                  "pwd=23092342"
                  cn.Open strCn
          posted @ 2009-01-19 11:02 肖馬輝 閱讀(278) | 評論 (0)編輯 收藏
           
          最近由于需要大概研究了一下MYSQL的隨機抽取實現方法。舉個例子,要從tablename表中隨機提取一條記錄,大家一般的寫法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

          但是,后來我查了一下MYSQL的官方手冊,里面針對RAND()的提示大概意思就是,在ORDER BY從句里面不能使用RAND()函數,因為這樣會導致數據列被多次掃描。但是在MYSQL 3.23版本中,仍然可以通過ORDER BY RAND()來實現隨機。

          但是真正測試一下才發現這樣效率非常低。一個15萬余條的庫,查詢5條數據,居然要8秒以上。查看官方手冊,也說rand()放在ORDER BY 子句中會被執行多次,自然效率及很低。
          You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
          搜索Google,網上基本上都是查詢max(id) * rand()來隨機獲取數據。
          SELECT *
          FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
          WHERE t1.id >= t2.id
          ORDER BY t1.id ASC LIMIT 5;

          但是這樣會產生連續的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因為15萬條的表,查詢只需要0.01秒不到。

          下面的語句采用的是JOIN,mysql的論壇上有人使用
          SELECT *
          FROM `table`
          WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
          ORDER BY id LIMIT 1;

          我測試了一下,需要0.5秒,速度也不錯,但是跟上面的語句還是有很大差距。總覺有什么地方不正常。

          于是我把語句改寫了一下。
          SELECT * FROM `table`
          WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
          ORDER BY id LIMIT 1;

          這下,效率又提高了,查詢時間只有0.01秒

          最后,再把語句完善一下,加上MIN(id)的判斷。我在最開始測試的時候,就是因為沒有加上MIN(id)的判斷,結果有一半的時間總是查詢到表中的前面幾行。
          完整查詢語句是:
          SELECT * FROM `table`
          WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
          ORDER BY id LIMIT 1;

          SELECT *
          FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
          WHERE t1.id >= t2.id
          ORDER BY t1.id LIMIT 1;

          最后在php中對這兩個語句進行分別查詢10次,
          前者花費時間 0.147433 秒
          后者花費時間 0.015130 秒
          看來采用JOIN的語法比直接在WHERE中使用函數效率還要高很多。
          posted @ 2008-12-12 16:13 肖馬輝 閱讀(206) | 評論 (0)編輯 收藏
           
          一、什么是索引?

            索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式保存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表里面的記錄數量越多,這個操作的代價就越高。如果作為搜索條件的列上已經創建了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查找記錄至少要比順序掃描記錄快100倍。

            假設我們創建了一個名為people的表:

            CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );

            然后,我們完全隨機把1000個不同name值插入到people表。在數據文件中name 列沒有任何明確的次序。如果我們創建了name列的索引,MySQL將在索引中排序name列,對于索引中的每一項,MySQL在內部為它保存一個數據文件中實際記錄所在位置的“指針”。因此,如果我們要查找name等于“Mike”記錄的peopleid(SQL命令為“SELECT peopleid FROM people WHERE name='Mike';”),MySQL能夠在name的索引中查找“Mike”值,然后直接轉到數據文件中相應的行,準確地返回該行的 peopleid(999)。在這個過程中,MySQL只需處理一個行就可以返回結果。如果沒有“name”列的索引,MySQL要掃描數據文件中的所有記錄,即1000個記錄!顯然,需要MySQL處理的記錄數量越少,則它完成任務的速度就越快。

            二、索引的類型

            MySQL提供多種索引類型供選擇:

            普通索引 :

            這是最基本的索引類型,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式創建:

            創建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);

            修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);

            創建表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );

            唯一性索引:

            這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式創建:

            創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);

            修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);

            創建表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );

            主鍵 :

            主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。如果你曾經用過AUTO_INCREMENT類型的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在創建表的時候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。

            全文索引:

            MySQL從3.23.23版開始支持全文索引和全文檢索。在MySQL中,全文索引的索引類型為FULLTEXT。全文索引可以在VARCHAR或者TEXT類型的列上創建。它可以通過CREATE TABLE命令創建,也可以通過ALTER TABLE或CREATE INDEX命令創建。對于大規模的數據集,通過ALTER TABLE(或者CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快。本文下面的討論不再涉及全文索引,要了解更多信息,請參見MySQL documentation。

            三、單列索引與多列索引

            索引可以是單列索引,也可以是多列索引。下面我們通過具體的例子來說明這兩種索引的區別。假設有這樣一個people表:

            CREATE TABLE people ( peopleid SMALLINT NOT NULL AUTO_INCREMENT,firstname CHAR(50) NOT NULL, lastname CHAR(50) NOT NULL, age SMALLINT NOT NULL,townid SMALLINT NOT NULL, PRIMARY KEY (peopleid) );

            下面是我們插入到這個people表的數據:

            這個數據片段中有四個名字為“Mikes”的人(其中兩個姓Sullivans,兩個姓McConnells),有兩個年齡為17歲的人,還有一個名字與眾不同的Joe Smith。

            這個表的主要用途是根據指定的用戶姓、名以及年齡返回相應的peopleid。例如,我們可 能需要查找姓名為Mike Sullivan、年齡17歲用戶的peopleid(SQL命令為SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age=17;)。由于我們不想讓MySQL每次執行查詢就去掃描整個表,這里需要考慮運用索引。

            首先,我們可以考慮在單個列上創建索引,比如firstname、lastname或者 age列。如果我們創建firstname列的索引(ALTER TABLE people ADD INDEX firstname (firstname);),MySQL將通過這個索引迅速把搜索范圍限制到那些firstname='Mike'的記錄,然后再在這個“中間結果集”上進行其他條件的搜索:它首先排除那些lastname不等于“Sullivan”的記錄,然后排除那些age不等于17的記錄。當記錄滿足所有搜索條件之后,MySQL就返回最終的搜索結果。

            由于建立了firstname列的索引,與執行表的完全掃描相比,MySQL的效率提高了很多,但我們要求MySQL掃描的記錄數量仍舊遠遠超過了實際所需要的。雖然我們可以刪除firstname列上的索引,再創建lastname或者age 列的索引,但總地看來,不論在哪個列上創建索引搜索效率仍舊相似。

            為了提高搜索效率,我們需要考慮運用多列索引。如果為firstname、lastname和age這三個列創建一個多列索引,MySQL只需一次檢索就能夠找出正確的結果!下面是創建這個多列索引的SQL命令:

            ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);

            由于索引文件以B-樹格式保存,MySQL能夠立即轉到合適的firstname,然后再轉到合適的lastname,最后轉到合適的age。在沒有掃描數據文件任何一個記錄的情況下,MySQL就正確地找出了搜索的目標記錄!

            那么,如果在firstname、lastname、age這三個列上分別創建單列索引,效果是否和創建一個firstname、lastname、age的多列索引一樣呢?答案是否定的,兩者完全不同。當我們執行查詢的時候,MySQL只能使用一個索引。如果你有三個單列的索引,MySQL會試圖選擇一個限制最嚴格的索引。但是,即使是限制最嚴格的單列索引,它的限制能力也肯定遠遠低于 firstname、lastname、age這三個列上的多列索引。

            四、最左前綴

            多列索引還有另外一個優點,它通過稱為最左前綴(Leftmost Prefixing)的概念體現出來。繼續考慮前面的例子,現在我們有一個firstname、lastname、age列上的多列索引,我們稱這個索引為fname_lname_age。當搜索條件是以下各種列的組合時,MySQL將使用fname_lname_age索引:

            firstname,lastname,agefirstname,lastnamefirstname

            從另一方面理解,它相當于我們創建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)這些列組合上的索引。下面這些查詢都能夠使用這個fname_lname_age索引:

            SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age='17'; SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan'; SELECT peopleid FROM people WHERE firstname='Mike'; The following queries cannot use the index at all: SELECT peopleid FROM people WHERE lastname='Sullivan'; SELECT peopleid FROM people WHERE age='17'; SELECT peopleid FROM people WHERE lastname='Sullivan' AND age='17';

            五、選擇索引列

            在性能優化過程中,選擇在哪些列上創建索引是最重要的步驟之一。可以考慮使用索引的主要有兩種類型的列:在WHERE子句中出現的列,在join子句中出現的列。請看下面這個查詢:

            SELECT age ## 不使用索引FROM people WHERE firstname='Mike' ## 考慮使用索引AND lastname='Sullivan' ## 考慮使用索引

            這個查詢與前面的查詢略有不同,但仍屬于簡單查詢。由于age是在SELECT部分被引用,MySQL不會用它來限制列選擇操作。因此,對于這個查詢來說,創建age列的索引沒有什么必要。下面是一個更復雜的例子:

            SELECT people.age, ##不使用索引town.name ##不使用索引FROM people LEFT JOIN town ONpeople.townid=town.townid ##考慮使用索引WHERE firstname='Mike' ##考慮使用索引AND lastname='Sullivan' ##考慮使用索引

            與前面的例子一樣,由于firstname和lastname出現在WHERE子句中,因此這兩個列仍舊有創建索引的必要。除此之外,由于town表的townid列出現在join子句中,因此我們需要考慮創建該列的索引。那么,我們是否可以簡單地認為應該索引WHERE子句和join子句中出現的每一個列呢?差不多如此,但并不完全。我們還必須考慮到對列進行比較的操作符類型。MySQL只有對以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE。可以在LIKE操作中使用索引的情形是指另一個操作數不是以通配符(%或者_)開頭的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE 'Mich%';”這個查詢將使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE '%ike';”這個查詢不會使用索引。

          posted @ 2008-12-12 09:49 肖馬輝 閱讀(511) | 評論 (0)編輯 收藏
           
          我們要把現實世界中的各種信息轉換成計算機能理解的東西,這些轉換后的信息就形成了數據。例如,某人的出生日期是“1987年5月23日”,他的身高是170厘米,等等。數據不僅包括數字、字母、文字和其他特殊字符組成的文本形式的數據,而且還包括圖形、圖像、動畫、影像、聲音等多媒體數據。但使用最多、最基本的仍然是文本數據。

                1. mysql的數據類型

                在mysql中有如下幾種數據類型:

                (1)數值型

                數值是諸如32 或153.4 這樣的值。mysql 支持科學表示法,科學表示法由整數或浮點數后跟“e”或“e”、一個符號(“+”或“-”)和一個整數指數來表示。1.24e+12 和23.47e-1 都是合法的科學表示法表示的數。而1.24e12 不是合法的,因為指數前的符號未給出。

                浮點數由整數部分、一個小數點和小數部分組成。整數部分和小數部分可以分別為空,但不能同時為空。

                數值前可放一個負號“-”以表示負值。

                (2)字符(串)型

                字符型(也叫字符串型,簡稱串)是諸如“hello, world!”或“一個饅頭引起的血案”這樣的值,或者是電話號碼87398413這樣的值。既可用單引號也可用雙引號將串值括起來。

                初學者往往分不清數值87398143和字符串87398143的區別。都是數字啊,怎么一個要用數值型,一個要用字符型呢?關鍵就在于:數值型的87398143是要參與計算的,比如它是金融中的一個貨款總額;而字符型的87398143是不參與計算的,只是表示電話號碼,這樣的還有街道號碼、門牌號碼等等,它們都不參與計算。

                (3)日期和時間型

                日期和時間是一些諸如“2006-07-12”或“12:30:43”這樣的值。mysql還支持日期/時間的組合,如“2006-07-12 12:30:43”。

                (4)null值

                null表示未知值。比如填寫表格中通訊地址不清楚留空不填寫,這就是null值。

                我們用create table語句創建一個表(參看前面的章節),這個表中包含列的定義。例如我們在前面創建了一個joke表,這個表中有content和writer兩個列:  

           

            

               定義一個列的語法如下:

          create table

          (

          content varchar(20) not null,

          writer varchar(10) null

          )

          col_name col_typy [col_attributes] [general_attributes]

           

           

               其中列名由col_name 給出。列名可最多包含64個字符,字符包括字母、數字、下劃線及美元符號。列名可以名字中合法的任何符號(包括數字)開頭。但列名不能完全由數字組成,因為那樣可能使其與數據分不開。mysql保留諸如select、delete和create這樣的詞,這些詞不能用做列名,但是函數名(如pos 和min)是可以使用的。

                列類型col_type表示列可存儲的特定值。列類型說明符還能表示存放在列中的值的最大長度。對于某些類型,可用一個數值明確地說明其長度。而另外一些值,其長度由類型名蘊含。例如,char(10) 明確指定了10個字符的長度,而tinyblob值隱含最大長度為255個字符。有的類型說明符允許指定最大的顯示寬度(即顯示值時使用多少個字符)。浮點類型允許指定小數位數,所以能控制浮點數的精度值為多少。

                可以在列類型之后指定可選的類型說明屬性,以及指定更多的常見屬性。屬性起修飾類型的作用,并更改其處理列值的方式,屬性有以下類型:

                (1)專用屬性用于指定列。例如,unsigned 屬性只針對整型,而binary屬性只用于char 和varchar。

                (2)通用屬性除少數列之外可用于任意列。可以指定null 或not null 以表示某個列是否能夠存放null。還可以用default,def_value 來表示在創建一個新行但未明確給出該列的值時,該列可賦予值def_value。def_value 必須為一個常量;它不能是表達式,也不能引用其他列。不能對blob 或text 列指定缺省值。

                如果想給出多個列的專用屬性,可按任意順序指定它們,只要它們跟在列類型之后、通用屬性之前即可。類似地,如果需要給出多個通用屬性,也可按任意順序給出它們,只要將它們放在列類型和可能給出的列專用屬性之后即可。

                2. mysql的列(字段)類型

                數據庫中的每個表都是由一個或多個列(字段)構成的。在用create table語句創建一個表時,要為每列(字段)指定一個類型。列(字段)的類型比數據類型更為細化,它精確地描述了給定表列(字段)可能包含的值的種類,如是否帶小數、是否文字很多。

                2.1數值列類型

                mysql有整數和浮點數值的列類型,如表1所示。整數列類型可以有符號也可無符號。有一種特殊的屬性允許整數列值自動生成,這對需要唯一序列或標識號的應用系統來說是非常有用的。

          類型

          說明

          tinyint

          非常小的整數

          smallint

          較小整數

          mediumint

          中等大小整數

          int

          標準整數

          bigint

          較大整數

          float

          單精度浮點數

          double

          雙精度浮點數

          decimal

          一個串的浮點數

          表1:數值列類型

                每種數值類型的名稱和取值范圍如表2所示。

          類型說明

          取值范圍

          tinyint[(m)]

          有符號值:-128 到127(- 27 到27 - 1)

          無符號值:0到255(0 到28 - 1)         1個字節

          smallint[(m)]

          有符號值:-32768 到32767(- 215 到215 - 1)

          無符號值:0到65535(0 到21 6 - 1)        2個字節

          mediumint[(m)]

          有符號值:-8388608 到8388607(- 22 3 到22 3 - 1 )

          無符號值:0到16777215(0 到22 4 - 1)          3個字節

          int[(m)]

          有符號值:-2147683648 到2147683647(- 231 到231- 1)

          無符號值:0到4294967295(0 到232 - 1)   4個字節

          bigint[(m)]

          有符號值:-9223372036854775808 到9223373036854775807(- 263到263-1)

          無符號值:0到18446744073709551615(0到264 – 1) 8個字節

          float[(m, d)]

          最小非零值:±1.175494351e - 38

          double[(m,d)]

          最小非零值:±2.2250738585072014e - 308

          decimal (m, d)

          可變;其值的范圍依賴于m 和d

          表2:數值列類型的取值范圍

                各種類型值所需的存儲量如表3所示。

          類型說明

          存儲需求

          tinyint[(m)]

          1字節

          smallint[(m)]

          2字節

          mediumint[(m)]

          3字節

          int[(m)]

          4字節

          bigint[(m)]

          8字節

          float[(m, d)]

          4字節

          double[(m, d)]

          8字節

          decimal (m, d)

          m字節(mysql < 3.23),m+2字節(mysql > 3.23 )

          表3:數值列類型的存儲需求

          mysql提供了五種整型: tinyint、smallint、mediumint、int和bigint。int為integer的縮寫。這些類型在可表示的取值范圍上是不同的。整數列可定義為unsigned從而禁用負值;這使列的取值范圍為0以上。各種類型的存儲量需求也是不同的。取值范圍較大的類型所需的存儲量較大。

                mysql 提供三種浮點類型: float、double和decimal。與整型不同,浮點類型不能是unsigned的,其取值范圍也與整型不同,這種不同不僅在于這些類型有最大值,而且還有最小非零值。最小值提供了相應類型精度的一種度量,這對于記錄科學數據來說是非常重要的(當然,也有負的最大和最小值)。

                在選擇了某種數值類型時,應該考慮所要表示的值的范圍,只需選擇能覆蓋要取值的范圍的最小類型即可。選擇較大類型會對空間造成浪費,使表不必要地增大,處理起來沒有選擇較小類型那樣有效。對于整型值,如果數據取值范圍較小,如人員年齡或兄弟姐妹數,則tinyint最合適。mediumint能夠表示數百萬的值并且可用于更多類型的值,但存儲代價較大。bigint在全部整型中取值范圍最大,而且需要的存儲空間是表示范圍次大的整型int類型的兩倍,因此只在確實需要時才用。對于浮點值,double占用float的兩倍空間。除非特別需要高精度或范圍極大的值,一般應使用只用一半存儲代價的float型來表示數據。

                在定義整型列時,可以指定可選的顯示尺寸m。如果這樣,m應該是一個1 到255的整數。它表示用來顯示列中值的字符數。例如,mediumint(4)指定了一個具有4個字符顯示寬度的mediumint列。如果定義了一個沒有明確寬度的整數列,將會自動分配給它一個缺省的寬度。缺省值為每種類型的“最長”值的長度。如果某個特定值的可打印表示需要不止m個字符,則顯示完全的值;不會將值截斷以適合m個字符。

                對每種浮點類型,可指定一個最大的顯示尺寸m 和小數位數d。m 的值應該取1 到255。d的值可為0 到3 0,但是不應大于m - 2(如果熟悉odbc 術語,就會知道m 和d 對應于odbc 概念的“精度”和“小數點位數”)。m和d對float和double 都是可選的,但對于decimal是必須的。在選項m 和d時,如果省略了它們,則使用缺省值。

                2.2字符串列類型

                mysql提供了幾種存放字符數據的串類型,其類型如下:

          類型名

          說明

          char

          定長字符串

          varchar

          可變長字符串

          tinyblob

          非常小的blob(二進制大對象)

          blob

          小blob

          mediumblob

          中等的blob

          longblob

          大blob

          tinytext

          非常小的文本串

          text

          小文本串

          mediumtext

          中等文本串

          longtext

          大文本串

          enum

          枚舉;列可賦予某個枚舉成員

          set

          集合;列可賦予多個集合成員

          表4:字符串列類型

                下表給出了mysql 定義串值列的類型,以及每種類型的最大尺寸和存儲需求。對于可變長的列類型,各行的值所占的存儲量是不同的,這取決于實際存放在列中的值的長度。這個長度在表中用l 表示。

          類型說明

          最大尺寸

          存儲需求

          char( m)

          m 字節

          m 字節

          varchar(m)

          m 字節

          l + 1字節

          tinyblob, tinytext

          28- 1字節

          l + 1字節

          blob, text

          216 - 1 字節

          l + 2字節

          mediumblob, mediumtext

          224- 1字節

          l + 3字節

          longblob, longtext

          232- 1字節

          l + 4字節

          enum(“value1”, “value2”, ...)

          65535 個成員

          1 或2字節

          set (“value1”, “value2”, ...)

          64個成員

          1、2、3、4 或8字節

          表5:串列類型最大尺寸及存儲需求

                l 以外所需的額外字節為存放該值的長度所需的字節數。mysql 通過存儲值的內容及其長度來處理可變長度的值。這些額外的字節是無符號整數。請注意,可變長類型的最大長度、此類型所需的額外字節數以及占用相同字節數的無符號整數之間的對應關系。例如,mediumblob 值可能最多224 - 1字節長并需要3 個字節記錄其結果。3 個字節的整數類型mediumint 的最大無符號值為224 - 1。這并非偶然。

                2.3日期時間列類型

                mysql 提供了幾種時間值的列類型,它們分別是: date、datetime、time、timestamp和year。下表給出了mysql 為定義存儲日期和時間值所提供的這些類型,并給出了每種類型的合法取值范圍。

          類型名

          說明

          date

          “yyyy-mm-dd”格式表示的日期值

          time

          “hh:mm:ss”格式表示的時間值

          datetime

          “yyyy-mm-dd hh:mm:ss”格式

          timestamp

          “yyyymmddhhmmss”格式表示的時間戳值

          year

          “yyyy”格式的年份值

          表6:日期時間列類型

          類型名

          取值范圍

          存儲需求

          date

          “1000-01-01”到“9999-12-31”

          3字節

          time

          “-838:59:59”到“838:59:59”

          3字節

          datetime

          “1000-01-01 00:00:00” 到“9999-12-31 23:59:59”

          8字節

          timestamp

          19700101000000 到2037 年的某個時刻

          4字節

          year

          1901 到2155

          1字節

          表7: 日前時間列類型的取值范圍和存儲需求

                下面舉個例子:

          create table student

          (

          name varchar(20) not null,

          chinese tinyint(3),

          maths tinyint(3),

          english tinyint(3),

          birthday date

          )

                這個例子創建一個student表,這個表中有name字段,字符類型列,不允許null(空值)。有chinese、maths和english三個整數類型列。還有個birthday日期類型列。

          posted @ 2008-12-12 09:48 肖馬輝 閱讀(111) | 評論 (0)編輯 收藏
           

          當我第一次見到php模板的時候,簡直被迷上了。原來php世界里還有這么好的東西。我瘋狂地學習。
          好在當時的php模板還不是很龐大,很快我了解了它的原理,并也能自己寫一些了。
          后來,smarty橫空出世,更是擁有了許多為它著迷的fans.許多人開始寫模板引擎,將smarty或其他模板加以改造,使之符合自己的需要。
          縱觀當今模板世界,php模板引擎主要分為兩種:
          一種是替換特定字串型的。美工做出來的頁面,中間會嵌入一些什么{block.title}這樣的字符串,然后程序讀入這個模板文件,將中間的{block.title}的字樣替換成實際從數據庫中讀取的內容。
          還有一種符雜一些,是一種編譯型的。以smarty為代表,模板文件中實際上包含了一些簡化的php代碼,比如有的寫的是<{=$site_name}>,<{if $counts>0 }>這樣的語句,實際是一種自行定義的語言格式。web開發久的人一眼能看出它們指的是什么。這一類往往會在第一次訪問時被預編譯,轉換成一個php文件何存起來。比如 <{=$site_name}>就變成了,<{if $count>0 }> 就變成了0) {?>。從第二次起,就直接包含已經編譯出來的php文件。當然,各種模板的處理的具體細節不一樣。

          但是,我們為什么要用模板?
          這個問題我也不能很好的回答。但是有很多人這么說:要讓美工和程序員的工作分開。要讓代碼層和表現層分開。
          那么我們看這兩種方式實現了嗎?
          讓您的美工人員打開一個smarty文件,讓他按他的思路去改一下視圖設計。他會告訴您,天哪,你怎么把我的設計變成這樣一幅樣子了?這些foreach,if都是什么意思?噢,天哪,我的表格怎么撐得這么大了?….
          原來編譯型的模板技術讓美工更沒法子做美工了。
          那么替換字符串型的呢?看起來是輕松多了。不過您可以測測您的程序速度,看看他是否已經慢了一倍以上。很容易,您用了太多的有preg_match,或是str_ireplace之類的語句來替換。程序重復一次又一次在您那幾萬個甚至更多字節的模板文件中查找某個字串,來替換內容。
          不僅如此,你還發現您哪天想在視層面插一點東西時,處處受制于模板。您肯定很想直接在模板中寫一段之類的語句,但是,很抱歉,您不能這么寫。如果只是想echo 一個什么東西,您可以在模板中加一個{{var}}的串,然后在php程序中寫
          $var=”這一個串”;
          $template->assign(”var”,$var);
          但是如果您不是想輸出呢,想做其他操作?抱歉,您還是得改php代碼。這些模板都支持規矩矩的表格狀的輸出,但是,如果我想輸出20條記錄,我要弄一個第一行2列記錄的,第二行3列的,第三行又是2行的之類的,或者是其他類似找碼,您打算怎么辦?
          難道再讓您的模板引擎也升級成為編譯性的,好讓您往您的模板中加入php語句?

          您錯了。其實,我們看一看,我們的模板引擎充當了什么樣的角色呢?我們把一段特定的按一定規則編寫的html代碼進行一定的數據處理后輸出成了另外一段,輸出過程中某些字符發生了改變。那我們的偉大的php干了什么呢?它幫我們把我們按規則寫好的php代碼也按一定規則輸出成了一段html。兩者本質是一樣的。只是,php本身比我們那些蹩腳的模板引擎更快,更漂亮。
          再說細一點,現在用的最多的Smarty.看一看它的結構:

          <{if $article.rates}>
          <span class="title"><{php}>echo art_constant("MD_RATE");<{/php}>:</span>
          <span class="item"><{$article.rating}>/<{$article.rates}></span>
          <{/if}>

          你覺得它是一個美工能看清的html文件么?
          看看編譯后的結果,它看起來應該是這樣的:

          <?php
          if($articles.rates){
          ?>
          <span class="title"><?php echo art_constant("MD_RATE");?>:</span>
          <span class="item"><?php echo $article.rating;?>/<?php echo article.rates;?></span>
          <?php
          }?>

          哈。我們偉大的smarty把這html也變成了php了。然后在以后的工作中,這些php代碼會直接被運行。
          有必要嗎?本來是apache承載php,php直接編譯php 源代碼,現在變成了apache承載php,php編譯smarty引擎,smarty引擎又去編譯html文件。反而多了一層,smarty自個兒把本來php要做的工作拿了做了。
          而且糟糕的是,smarty的模板打開來以后,比php文件更讓人難以看清。
          所以我說,放棄您的模板系統吧。但記住我們開發模板系統的初衷。

          您會說:那要是放棄模板系統了,我怎么分開程序邏輯和視圖層面?
          這個也太好辦了。您可以這樣寫:
          第一個文件這樣寫:

          <?php
          /**
          file :logic.php
          @author renlu xu<helloasp@hotmail.com>
          @link http://www.162cm.com
          */
          $rs=mysql_query("select id,title,body from articles order by id desc limit 30");
          while($row=$mysql_fetch_assoc($rs))
          {
          $rows[]=$row;
          }
          ?>

          第二個文件作為您的視層面的文件。您可以讓您的平面設計師在mac上設計漂亮絕頂的圖片,然后切成html文件,交給您的頁面整合工程師。這個工程不需要懂太多php,他基本上只需要會用print就行了。他把這個html文件改名為view.php,然后在里面加上相應代碼:

          <?php
          /**
          file:view.php
          @author renlu xu<helloasp@hotmail.com>
          @link http://www.162cm.com
          */
          foreach($rows as $row)
          {
          echo "<tr>";
          echo "<td>";
          echo $row["id"];
          echo "</td>";
          echo "<td>";
          echo $row["title"];
          echo "</td>";
          echo "</tr>";
          }
          ?>

          ok.這就視層面文件。這個文件用織夢者(dreamweaver)打開后,應該跟美工做出來的圖是一樣的,就僅僅多了用那個黃色的問號代表的php代碼。寫得好時,dreamweaver還能列出您的php代碼中輸出了什么內容,效果更佳。
          這兩個文件,就是一個是邏輯層,一個是視層面。
          然后用index.php將他們包含起來。

          <?php
          /**
          file:index.php
          @author renlu xu<helloasp@hotmail.com>
          @link http://www.162cm.com
          */
          include "databaseConnect.php";//連接數據庫的代碼,我就不寫了
          include "logic.php";
          include "view.php";
          include "cache.php";
          ?>

          這樣邏輯和視,就分開了。那有人會說,如果我用模板,可以將要輸出的內容寫入到靜態文件中,現在沒了模板我該怎么辦?
          這個不是問題。我們用的是php,超酷的php.
          看看,我們加了cache.php.這就是用來實現您說的緩存效果的。
          我們的cache文件:

          <?php
          /**
          file:cache.php
          @author renlu xu<helloasp@hotmail.com>
          @link http://www.162cm.com
          */
          $content=ob_get_content();
          $fp=fopen("index.html","w");
          fwrite($fp,$content);
          fclose($fp);
          ?>

          當然,index.php也改成:

          <?php
          /**
          file:index.php
          @author renlu xu<helloasp@hotmail.com>
          @link http://www.162cm.com
          */
          if(file_exists("index.html"))
          {
          include "index.html";
          exit();
          }
          include "databaseConnect.php";//連接數據庫的代碼,我就不寫了
          include "logic.php";
          include "view.php";
          incldue "cache.php";

          ?>

          這樣您看這緩存效果是不是就出來了?

          有人說:我用模板還有一個好處啊,就是模板寫錯了還不會影響到程序的運行。是的。咳,怎么說呢?您在模板中將<{=$site_name}>寫成了<{=$sie_name}>是沒啥,您的php程序還是很”健壯”地運行著。不過您沒覺得,當您期望的那一個將由<{=$site_name}>來打出來的網站名稱沒有出現的時候,您排起錯來會很難找嗎?對于一個程序師來說,您不覺得,光只視層面的那些echo語句,只應該是您工作中極微不足道的一部分嗎?在這個主要是echo語句構成的視層面文件view.php,您還出現編譯期錯誤,是不是該拉出去打屁屁?

          另外,在php程序正式上線運行時,您也可以將它的報錯功能關閉啊。

          posted @ 2008-11-04 14:26 肖馬輝 閱讀(1145) | 評論 (0)編輯 收藏
           
               摘要: Student(S#,Sname,Sage,Ssex) 學生表 Course(C#,Cname,T#) 課程表 SC(S#,C#,score) 成績表 Teacher(T#,Tname) 教師表 問題: 1、查詢“001”課程比“002”課程成績高的所有學生的學號; select a.S# from (select s#,score fr...  閱讀全文
          posted @ 2008-10-28 18:31 肖馬輝 閱讀(185) | 評論 (0)編輯 收藏
           
          由于斷電或非正常關機而導致MySQL數據庫出現錯誤是非常常見的問題。有兩種方法,一種方法使用mysql的check table和repair table 的sql語句,另一種方法是使用MySQL提供的多個myisamchk, isamchk數據檢測恢復工具。前者使用起來比較簡便。推薦使用。

          1. check table 和 repair table
          登陸mysql 終端:
          mysql -uxxxxx -p dbname
          > check table tabTest;
          如果出現的結果說Status是OK,則不用修復,如果有Error,可以用:
          > repair table tabTest;
          進行修復,修復之后可以在用check table命令來進行檢查。在新版本的phpMyAdmin里面也可以使用check/repair的功能。

          2. myisamchk, isamchk
          其中myisamchk適用于MYISAM類型的數據表,而isamchk適用于ISAM類型的數據表。這兩條命令的主要參數相同,一般新的系統都使用MYISAM作為缺省的數據表類型,這里以myisamchk為例子進行說明。當發現某個數據表出現問題時可以使用:

          myisamchk tablename.MYI

          進行檢測,如果需要修復的話,可以使用:

          myisamchk -of tablename.MYI

          關于myisamchk的詳細參數說明,可以參見它的使用幫助。需要注意的時在進行修改時必須確保MySQL服務器沒有訪問這個數據表,保險的情況下是最好在進行檢測時把MySQL服務器Shutdown掉。

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

          另外可以把下面的命令放在你的rc.local里面啟動MySQL服務器前:

          [ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI

          其中的/tmp/mysql.sock是MySQL監聽的Sock文件位置,對于使用RPM安裝的用戶應該是/var/lib/mysql/mysql.sock,對于使用源碼安裝則是/tmp/mysql.sock可以根據自己的實際情況進行變更,而pathtochk則是myisamchk所在的位置,DATA_DIR是你的MySQL數據庫存放的位置。

          需要注意的時,如果你打算把這條命令放在你的rc.local里面,必須確認在執行這條指令時MySQL服務器必須沒有啟動! 

          檢測修復所有數據庫(表)
          mysqlcheck -A -o -r -p 
          ---------------------------------------------------------------------------------
          posted @ 2008-10-27 22:45 肖馬輝 閱讀(123) | 評論 (0)編輯 收藏
           

          Private Sub Command1_Click()
          RegExpTest "123", "99912344"
          End Sub

          Function RegExpTest(patrn, strng)
          Set regEx = CreateObject("VBScript.RegExp")      '     &&建立正則表達式對象
          regEx.Pattern = patrn                '                                 &&設置模式
          regEx.IgnoreCase = True       '                                        &&設置是否區分字符大小寫
          regEx.Global = True       '                                                &&設置全局可用性
          Set matches = regEx.Execute(strng)        '                     &&執行搜索
          RetStr = ""
          For Each match In matches               '                        &&遍歷匹配集合
              RetStr = RetStr + "找到位置:   " + LTrim(Str(match.FirstIndex)) + "," & vbCrLf
              RetStr = RetStr + "長度為   " + LTrim(Str(match.Length)) + "," & vbCrLf
              RetStr = RetStr + "找到結果為   " + match.Value + "." + Chr(10) + Chr(13) & vbCrLf
          Next
          MsgBox RetStr
          End Function

          posted @ 2008-10-27 15:10 肖馬輝 閱讀(1109) | 評論 (0)編輯 收藏
           
          SELECT * FROM (SELECT albumid,(SELECT COUNT(userName) FROM albumPhoto WHERE albumID=album.albumID) as albumCOUNT FROM album ) A WHERE albumcount =0
          posted @ 2008-10-24 16:47 肖馬輝 閱讀(130) | 評論 (0)編輯 收藏
           
          osCommerce是什么

          如果你對osCommerce還不了解,本章會告訴你它是什么,可以為你帶來什么好處,以及一點點非常有用的內容。
          Commerce是“商業”的意思,os是Open Source的英文縮寫,Open Source中文稱為“開放源代碼”,以下均簡稱為“開源”。取名為osCommerce的意思就代表“開放源代碼的商業軟件”,進一步來說, osCommerce是一個利用互聯網建立網上商店的應用程序,所以我們可以稱它是“開源網上開店程序”。

          1.1 最好的免費電子商務解決方案

          osCommerce 是一套由自由軟件開發社團開發并維護的在線商店的解決方案。由于遵循開源軟件開發和發布協議,osCommerce可以自由下載、安裝和使用,并可以根據自己的需要進行修改和發布,可以應用到任何的商業環境中,但是不能夠利用本身進行營利性質的活動[修改] ,詳細的GNU General Public License協議參照附錄。
          這套系統擁有簡單的安裝、靈活的設置和強大的后臺維護功能,可以讓不懂技術的使用者根據參考的文檔和說明非常容易的在自己的系統平臺上,比如自己的Windows電腦上面安裝和運行自己的電子商務網站。如果遇到問題,可以到官方的支持社區尋求幫助,在那里,我們可以找到許多資源,可以到技術支持論壇上搜索和提出你的問題,可以在插件欄目下搜索你需要的外掛插件,可以到FAQ上尋求一般的問題解答,這一切都使得osCommerce具有旺盛的生命力。

          1.2 開放源碼的技術平臺

          osCommerce 采用了 Open Source 世界里多種主流的技術方案,提供了一整套的免費和開放式的平臺,包括強大的 PHP 動態網站開發語言,穩定的 Apache web 服務器, 和速度一流的 MySQL 數據庫服務器。
          安裝和使用osCommerce,不需要特殊的系統平臺,osCommerce 可以運行在任何支持 PHP3 或 PHP4 的 web 服務器上, 環境需要支持 PHP 和 MySQL 即可, 操作系統可以支持 Linux, Solaris, BSD, 或者 Microsoft Windows 。

          osCommerce的歷史

          根據官方網站osCommerce項目開始與2000年的三月,自開發成熟以來,已經成為全世界1395家已經注冊的在線商店的解決方案,并且這個數字還在持續增加。在全球已經建立除了官方網站之外的5個國際性的支持站點,荷蘭、法國、德國、日本和西班牙,非官方的專題技術站點則更多。
          今天,一個國際化的團隊正在帶領osCommerce走向一個新的階段,它將成為一個電子商務解決方案的框架,不僅僅提供簡單易用的設置和維護功能,還將使得商店的管理員更加容易的定制和修改修改他們的站點,采用他們特有的方式將自己的商店展示在客戶的面前。
          OsCommerce的背后有一個強大和活躍的社區,這是osCommerce項目得以如此成功的一個重要原因,在社區里,成員之間互相幫助,大家積極參與到開發的進程中,反映了項目的最新狀況。

          如何利用osCommerce

          3.1 官方推薦的特色商店的介紹

          http://www.oscommerce-cn.com/bbs/viewtopic.php?t=33
          http://www.oscommerce-cn.com/bbs/viewtopic.php?t=32
          http://www.oscommerce-cn.com/bbs/viewtopic.php?t=29
          http://www.oscommerce-cn.com/bbs/viewtopic.php?t=24
          http://www.oscommerce-cn.com/bbs/viewtopic.php?t=23
          http://www.oscommerce-cn.com/bbs/viewtopic.php?t=22



          從osCommerce中獲益

          3.3.1 誰能夠從osCommerce中獲益

          利用osCommerce程序,我們可以做許多事情,從多個方面都可以獲得收益,包括:
          l 商業用戶:創建和管理自己的在線商店
          l 消費者:在osCommerce支持的站點上進行購物
          l 網站設計者:輕松的更改電子商務站點的風格和外觀設計
          l 站點開發人員:輕松的開發個性化的功能模塊,學習其優秀的開發思想和代碼
          l 電子商務專家:利用在線商店進行理論研究和實踐
          osCommerce作為一套成熟的應用軟件平臺,可以滿足不同人士的需要,所有osCommerce的關注者都會加入到專業的支持社區進行問題討論,獲取最新的咨詢和互相學習提高。

          3.3.2 你如何從osCommerce中獲益

          我們已經了解了osCommerce的思路和框架,我們可以從整體上看看我們可以如何利用osCommerce建立自己的商業王國,針對不同的站點,使用osCommerce可以解決不同的問題。
          可以利用它的目錄產品管理系統做產品發布,即使你不需要立即在網上讓你的客戶進行購物行為,也可以利用osCommerce管理和發布的你的產品,不需要你自己編寫代碼,就可以有一個動態的程序為你完成后臺增加產品,前臺進行展示的工作。
          請你的客戶在線注冊,通過osCommerce的客戶管理功能對于你的客戶進行簡單的管理,定期的發送統一的宣傳郵件給他們,告訴他們你現在的最新狀態和進展,告訴他們的最新產品,通過郵件與他們長久的保持聯系,讓他們到你得網站上看看最新的資料。
          整合你網站的內容,如果你已經擁有一個信息發布平臺,擁有了許多訪問的客戶,那太好了,正是使用osCommerce的時候,可以將它的在線購物作為一個欄目增加到你的導航上來,你用有的的是一個完整的綜合站點。
          進一步整合客戶和論壇用戶資源,現在已經有一些技術站點在開發和研究這些內容,我們在下面進行簡單的介紹,將是你得網上事業如虎添翼。

          3.4 osCommerce相關軟件

          如果你是使用google搜索osCommerce,你會發現許多技術站點正在進行一項非常有意義的工作,就是將osCommerce和PHP世界中的幾個流行的軟件整合起來,比如:nuke,xoops,phpbb。
          將這些系統整合在一起,可以讓他們共享注冊用戶,讓客戶和管理員的你在網站上獲得更加多的體驗,你可以更加容易的發布新聞(當然,是用 osCommerce的插件也可以很好的完成這樣的工作)他們可以看到最新發布的消息,可以讓客戶和你在論壇上共同交流,互動起來等等,我們會逐步介紹一些有用的插件。
          posted @ 2008-09-28 09:53 肖馬輝 閱讀(233) | 評論 (0)編輯 收藏
          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
           
          主站蜘蛛池模板: 罗平县| 万年县| 启东市| 广宗县| 聂荣县| 阿城市| 泾源县| 甘孜县| 启东市| 通州市| 嘉荫县| 莱阳市| 金乡县| 红原县| 瑞丽市| 渝中区| 宜昌市| 汉川市| 兴文县| 石首市| 本溪市| 大厂| 雷州市| 忻城县| 双鸭山市| 西乌| 沅江市| 金湖县| 广南县| 绥棱县| 八宿县| 乌拉特中旗| 永城市| 温宿县| 浦东新区| 平湖市| 台湾省| 萍乡市| 南充市| 苍梧县| 东方市|