2008年07月4日

SQLite/PHP/Apache 設定筆記

Tags: php sqlite database

SQLite 目前有兩種版本,一是 SQLite 2,另一為 SQLite 3。PHP 兩種都支援,但所需的擴充項(extension)並不相同。

SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.
SQLite Home Page

在 PHP 中使用 SQLite2 ,必須載入 SQLite 擴充項(sqlite.so/php_sqlite.dll)。

在 PHP 中使用 SQLite3 ,必須載入 PDO_SQLite 擴充項(pdo_sqlite.so/php_pdo_sqlite.dll)。同時這也表示兩件事。一,SQLite3 是 PDO 擴充項的一個工廠(factory) ,你必須透過 PDO 介面去呼叫 SQLite3 的方法。二,PHP5 或以上的版本才支援 PDO 擴充項,故 PHP4 不能使用 SQLite3。

...繼續閱讀

Posted by shirock at 樂多Roodo!11:23回應(0)引用(0)

2008年06月24日

新增資料時自動產生識別代號的一些方法

Tags: sql serial max

時常接觸資料庫應用的編程人員,應該都會遇到需要新增資料後自動產生一個識別代號(ID)的設計。但遺憾的是, SQL Standard 並沒有定義任何相關型態或函數。於是各種資料庫系統都有自己的一套做法。使得這種普遍的應用設計,帶來了一個可攜性陷阱。

在不考慮使用資料庫系統特定方法的情況下,我長久以來習慣用 MAX(id) + 1 產生識別代號。至於 MySQL 的用戶,我都特別為它準備另一個 SQL Schema,改用 MySQL 特有的 AUTO_INCREMENT 欄位屬性。

...繼續閱讀

Posted by shirock at 樂多Roodo!12:04回應(0)引用(0)

2008年04月28日

Oracle 的表格、欄位名稱都要大寫嗎?

jaceju : Oracle 的表格、欄位名稱都要大寫這個限制實在很鳥...不曉得有沒有哪位 Oracle 前輩能指點一二?

關於欄位名稱,其實是可以指定大小寫的,但要用 雙引號 (") 括起來。一個「非雙引號括起的」欄位名稱都要大寫這件事,其實是 SQL Standard。而且這是內定程序。

10)The <identifier body> of a <regular identifier> is equivalent to an <identifier body> in which every letter that is a lower- case letter is replaced by the equivalent upper-case letter or letters. This treatment includes determination of equiva- lence, representation in the Information and Definition Schemas, representation in the diagnostics area, and similar uses. SQL 92

但是 SQL Standard 也允許你用雙引號(doublequote) 字元括起名稱,這時就會抑制大小寫轉換的動作。這是 SQL Standard 配合國際字元集所定的規則。在這種情形下,也 SQL Standard 也允許你用保留字做為欄位名稱。

Oracle 在這方面完全遵循 SQL Standard 。也可以參考 Oracle reference 的內容: Oracle Database SQL Language Reference 11g Release 1::Schema Object Names and Qualifiers。就我個人實際使用經驗, PostgresSQL, MS SQL Server, IBM DB2 以及我最不喜歡的 MySQL方言,都遵循這個作法。

話說回來, MySQL 也是一樣,你把欄位名稱輸入小寫符號,MySQL DBMS內部也是全部轉大寫在處理(還是小寫?我忘了,反正結果一樣)。除非你用雙引號括起來,才會保留大小寫差異。


Posted by shirock at 樂多Roodo!17:47回應(8)引用(0)

2008年03月27日

BIT and CHAR

Tags: database sql

BIT 與 CHAR 使用筆記。以 SQL92 為基準。

BIT很少用,前一陣子為了使用這種資料型態,google了不少資料,不過大部份網路資料都沒有提供什麼有用的資訊 (市面上的 SQL 書籍更是不提)。最後還是在各家資料庫系統本身的 Manual 中找到資訊。留下筆記,以供日後查閱。

...繼續閱讀

Posted by shirock at 樂多Roodo!11:13回應(0)引用(0)

2008年01月15日

以源碼探索 PHP 查詢 MySQL 後儲存資料結果的方式

Tags: php mysql database 記憶體管理

基於以下系列討論內容的一大串源碼追蹤。以印證討論內容。

Remember this: Open your mind, use the source.

...繼續閱讀

Posted by shirock at 樂多Roodo!11:35回應(2)引用(0)

2007年07月29日

SQL tips review

Tags: SQL

jaceju 提到 一篇關於 MySQL 查詢效率的文章: PHP Mysql tips。基本上,該文所列的最快語法,我全部都不建議使用。因為都是 MySQL 特有語法,不具有可移植性。雖然該文主要就是在談 MySQL tips ,但基於可移植性的理由,這種語法能不用就不用。

其他的 SQL 系統,如 PostgreSQL, SQL Server 等等,都針對標準語法(ANSI SQL)做了最佳化。使用同樣的標準語法查詢時,它們的表現不比 MySQL 差。

...繼續閱讀

Posted by shirock at 樂多Roodo!8:41回應(0)引用(0)

2007年06月13日

TWPUG問答 - 查詢結果附上其他資訊?

Tags: SQL CASE

原問題: 查詢結果附上條件?。需求是有一個來自使用者輸入的對照表,由於其內容每次輸入都不同,故並未建立在資料庫中。現在需要在查詢結果中加入此一對照資訊。

純 SQL 的方式可配合 CASE 關鍵字,但受限於查詢句子的長度及複雜度,僅適用於少量資訊。

...繼續閱讀

Posted by shirock at 樂多Roodo!8:55回應(0)引用(0)

2007年05月21日

TWPUG問答: SQL 文字搜尋

Tags: sql like
I try to write a searching engine with php and mysql. Somehow I always get error messages. Here is my code:
$sql = "SELECT * FROM `General` WHERE `Item_Name` LIKE $Name";
TWPUG::資料庫討論區

SQL syntax error.

  1. The field-name should be put in double-quote. It means case-sensitive.
  2. The LIKE only applies for text-based type field, therefore you need to put content in single-quote. Besides, LIKE must be used with '%'.
...繼續閱讀

Posted by shirock at 樂多Roodo!16:03回應(0)引用(0)

2007年03月7日

以 replace 修正整批記錄的錯字

今天修正了公司客戶資料庫中的電話資料。主要是將中間的連接線 (-) 拿掉,這是人工輸入的,但實際上根本用不著。不是很難的動作,用 replace() 就搞得定。

比較麻煩的是電話有二組,但有不少資料記錄漏掉第一組電話。起因於門市人員在建檔時,常常把第一組電話當市話號碼欄位、第二組電話當手機號碼欄位。當碰到客戶只填手機而不填家中電話時,就會空下第一組電話欄位。因為資料庫系統以第一組電話欄位為主要電話,所以這會帶來些麻煩。例如,在列印單據時,如果單據只顯示一個電話時,資料庫系統只會取紀錄中的第一組電話欄位。如此一來就有不少單據上沒有顯示客戶電話。所以這次也順便把那些沒有第一組電話欄位的紀錄一起補上 (以第二組電話補上) ,這就要用 CASE 敘述了。

UPDATE customer
SET
	tel1 = REPLACE(CASE WHEN tel1 IS NULL THEN tel2 ELSE tel1 END, '-', '')
	tel2 = REPLACE(tel2, '-', ''),

Posted by shirock at 樂多Roodo!14:45回應(0)引用(0)

2006年12月28日

Case study - 運動會報名表單, 多對多關聯

欲建立一個運動會報名表單,一位選手可報名參加一個以上的項目 (如100公尺、200公尺等) ,資料庫表格應如何設定?

我們通常不會在一個選手表格中建立多個比賽項目的關聯欄位,像 game1, game2, game3 這種欄位設置就不太適當。第一、如果多數選手只參與一個項目,則剩下的 game2, game3, etc. 欄位就閒置了,佔用磁碟空間。第二、限定了可參加比賽項目數的上限,如果我只定義到 game3 ,則一位選手最多只能參加 3 個比賽項目。第三、只能用複雜且僵化的查詢語句,例如 SELECT * FROM "Players" INNER JOIN "Games" ON "Games".id = "Players".game1 OR "Games".id = "Players".game2 OR "Games".id = "Players".game3; ,欄位愈多則 OR 條件 串的愈長。當然,如果程式需求限定每位選手至少參加一個項目,最多參加 2 個,那麼用這種方法倒也無妨。

...繼續閱讀

Posted by shirock at 樂多Roodo!18:12回應(2)引用(0)
 [1]  [2]  [3]  [最終頁]