首先安裝 PostgreSQL
1.你本地是什麼開發環境?
- 如果你的開發環境是
Homestead
,那麼恭喜你,不需要安裝,直接使用。- 資料庫賬號:
homestead
- 資料庫密碼:
secert
- 資料庫賬號:
- 如果你的開發環境是整合的,或者自己搭建的環境,需要另行下載
PostgreSQL
。安裝過程很簡單,按提示一步步走,不會的可參考菜鳥教程中 PostgreSQL 安裝 Windows 和 Mac。最後需要設定並記住你資料庫的密碼。預設賬號是:postgres
密碼是:*你設定的密碼*
2. 其次要看 PHP 支援的 pdo_pgsql
支援的 libpq
版本。
scram-sha-256是PostgreSQL 10中新增的基於SASL的認證方式,是PostgreSQL目前提供的最安全的認證方式。使用scram-sha-256認證方式不支援舊版本的客戶端庫。如果使用PostgreSQL 10以前的客戶端庫連線資料庫,會有如下錯誤:
SCRAM authentication requires libpq version 10 or above
根據上面提示,注意你選擇下載安裝的
PostgreSQL
版本,它與你的PHP
對應的pdo_pgsql
擴充套件的libpq
版本有關,他是連結資料庫的客戶端擴充套件。如果你的下載的 PostgreSQL 版本高,但是 PHP 擴充套件的libpq
版本低,就會出現這個錯誤:SCRAM authentication requires libpq version 10 or above
。現在開啟你 PHP 的
pdo_pgsql
或pgsql
擴充套件,如果沒有此擴充套件,去下載編譯,具體過程我不再贅述。然後透過輸出phpinfo()
函式,然後檢視 PHP 對應的libpq
的版本,PostgreSQL 版本大於10 的話,需要 PHP 擴充套件libpq
的版本至少大於 10:
使用 Navicat 資料連線工具測試連線
虛擬主機中的 Homestead 開發環境連線 PostgreSQL:
本地整合開發環境連線 PostgreSQL:
配置 Laravel 的 .env
檔案需要注意的:
- homestead 的 Laravel 框架的配置:
DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 // 因為程式碼是在虛擬主機中,無需使用對映到主機上的埠,5432 即可。 DB_DATABASE=psbc DB_USERNAME=homestead DB_PASSWORD=secert
- 本地開發環境的 Laravel 框架的配置::
DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=psbc DB_USERNAME=postgres DB_PASSWORD=root
遷移檔案需要注意的點:
1. boolean
型別的使用。
型別 boolean tinyint(1) MySQL 官方文件指出目前不支援 boolean 型別,需要使用的話用 tinyint(1) 代替。如果你定義了布林型別,它會自動給你轉換成 tinyint。 BOOL,BOOLEAN是 tinyint(1) 的同義詞。
遷移檔案內容如下:
public function up() { Schema::table('ttx_staff', function (Blueprint $table) { // 新增一個員工的狀態欄位 $table->boolean('status')->default(1)>after('article_num')->comment('使用者狀態'); }); }
像上面的的遷移檔案中
boolean
方法,在執行遷移命令後:- PostgreSQL 資料庫表中生成的是
boolean
型別的status
欄位。 - mysql 資料庫表中生成的是
tinyint
型別的status
欄位。
- PostgreSQL 資料庫表中生成的是
也就是說 PostgreSQL 支援標準的
boolean
型別,MySQL 是不直接支援的,它是變相的支援。有關更多 PostgreSQL 支援的型別,請檢視 PostgreSQL 資料型別
在這裡還有一個需要注意,
after()
方法在PostgreSQL
資料庫表中是不能用的,因為PostgreSQL
資料庫本身不支援表欄位移動位置。但是MySQL
是可以的。
2. char
型別的使用。
遷移檔案內容如下:
Schema::create('ttx_config', function(Blueprint $table) { // 看這個 key 欄位的型別,它在 MySQL 和 PostgreSQL 中是有區別的 // char 不給長度,Laravel 預設給字串長度為 255 $table->char('key')->comment('配置名'); $table->text('val', 65535)->nullable()->comment('配置值'); });
如果是 MySQL 生成的表欄位,它的欄位型別是
char
。如果你的 PostgreSQL 生成的表欄位,它的型別也是
char
。說道這裡是不是感覺沒什麼差別,請繼續往下看你就明白了。
- 我在
tinker
中執行一個資料庫查詢 - 使用 PostgreSQL:
- 使用 MySQL:
- 我在
以上兩點是我已知的
Laravel
配合PostgreSQL
或配合MySQL
在遷移檔案中使用出現不同的點。雖然不多,但都坑了我不少時間。如果你們發現有更多不同點,可以在文章下方留言討論。
資料查詢需要注意的點:
1. LIMIT 的使用:
PostgreSQL 不能使用
LIMIT 初始位置,記錄數
這種方式查詢。- 正確的:
DB::SELECT("SELECT * FROM ttx_config LIMIT 1 OFFSET 2")
- 錯誤的:
DB::SELECT("SELECT * FROM ttx_config LIMIT 2, 1")
- 正確的:
以上兩種方式的 LIMIT 查詢,MySQL 都支援。
2. `` 符號的使用:
PostgreSQL 不能使用 `` 這種符號。
- 正確的:
DB::SELECT("SELECT * FROM ttx_config LIMIT 1 OFFSET 2")
- 錯誤的:
DB::SELECT("SELECT * FROM `ttx_config` LIMIT 2, 1")
- 正確的:
以上兩種方式的查詢,MySQL 都支援。
3. IFNULL 函式的使用:
PostgreSQL 沒有
IFNULL
這個函式。取而代之的是COALESCE(欄位,預設值)
這個函式。MySQL 支援
IFNULL
函式。
本作品採用《CC 協議》,轉載必須註明作者和本文連結