PostgresSQL 官方文件實在缺東缺西,只好找第三方教學文件來看了:
- First steps – PostgreSQL wiki
- Postgres Guide
- 當然 awesome 系列是必備的:dhamaniasad/awesome-postgres
軟體開發、伺服器和生活瑣事
PostgresSQL 官方文件實在缺東缺西,只好找第三方教學文件來看了:
看到有 Java 工程師在學 PHP 遇到變數初始化的問題,覺得有趣,做個筆記順便複習 PHP 的特性。
Java 是強型別 (strong type) 的程式語言,所有的變數在使用之前都必須給資料型態以及初始值;PHP 則是弱型別,就算不給值、不給資料型態也沒差,interpreter 會在 runtime 的時候自動做型別轉換在繼續執行程式。我想 PHP 這一特性就會讓很多 Java 工程師決得很莫名其妙吧,沒定義的變數到底要怎麼用?執行的時候真的不會出事嗎? (其實就是會 XD)
先來看正常的寫法:
$x = 'hello';
var_dump($x); // "hello"
如果變數沒有給值會發生什麼事?
var_dump($x); // NULL
PHP 把沒有初始化的變數帶入 NULL 來使用,連錯誤訊息都沒噴耶?其實有,只是要調整一下 error reporting 的 level:
error_reporting(E_ALL);
var_dump($x);
// Notice: Undefined variable: x
// NULL
如果拿一個完全沒有被初始化的變數做運算,interpreter 到底會怎麼轉型:
var_dump('123' . $x); // "123"
$x[] = '123';
var_dump($x); // array([0] => "123")
好像很強耶,居然會自動轉陣列!那換個方式來玩玩看:
$list = [1, 2, 3];
array_merge($list, $x);
// PHP Warning: array_merge(): Argument #2 is not an array
其實還是會遇到 interpreter 沒辦法幫你作主的時候。
以 PHP 這類的弱型別寫法,比較保險的作法就是去檢查要被使用的變數到底是否有初始化:
if (isset($x)) {
var_dump($x);
} else {
echo 'undefine';
}
// "undefine"
所以使用 PHP 寫程式時變數到底是否需要初始化?其實可以不用,但是若要保險起見 (防禦性程式設計),要用到的變數建議都要初始化、或是做檢查。StackOverflow 上也有提到:
最近在 refactor legacy code,遇到很尷尬的函式定義,笑也不是哭也不是。
函式會要求使用者傳入多個參數,有時並不是所有的參數都必須給值,函式的設計者會以大家較常使用的方式來當作參數的預設值,例如 PHP 裡面的「json_decode()」:
json_decode($json); // consider as json_decode($json, false)
json_decode($json, true); // 不使用預設值才手動傳數第二個參數
但這次遇到比較尷尬的是,legacy code 把第一個參數設計為 optional,也就是有預設值。但問題來了,在 PHP 的語法當中,呼叫函式無法在前幾個參數不給值:
getData( , 'some', 'option'); // syntax error
所以不管怎麼樣,都至少要給第一個參數:
getData(null, 'some', 'option');
所以把有預設值的參數放在前面其實根本沒有省下什麼時間呀 … XD
不多說,連結是:https://term.ptt.cc
這次會讓我比較興奮的是從 telnet 通訊協定,換上 HTTPS + websocket,這樣帳號密碼傳送就安全很多了。
其實叫早之前也是可以使用 SSH 連線:
ssh bbs@ptt.cc
ssh bbsu@ptt.cc # UTF-8 版本
翻了一下 source code,這次網頁有用心處理編碼轉換問題,一開始就載入了 big5 <-> UTF-8 對應表。接下來就全部使用 websocket 連線了。
今天又遇到相同的問題,解法有很多種,可以從 SQL 下手,也可以在 table schema 就先做好設定。
假設原本的 SQL 為:
SELECT * FROM users WHERE name = ‘john’ ;
這樣會撈出「John」、「john」等結果。那麼可以要求 MySQL 使用 binary 的辨識方法去做搜尋:
SELECT * FROM users WHERE binary name = 'johhn';
這樣一來,查詢時 name 欄位就會區分大小寫來做查詢。
如果在設計 table 時,就確定查詢一定要區分大小寫時,可以在 create table 就先將欄位設定好:
CREATE TABLE users (
name varchar(100) binary
)
這樣之後下 query 時,只要遇到 name 欄位,就自動會區分大小寫。
一般常用的 collation 是「utf8_general_ci」,該 collation 最後面的「ci」其實是「Case Insensitive」的意思,也就是不區分大小寫。
如果要讓該 table 的所有欄位都區分大小寫,可以將 collation 的 postfix 改為「cs」或是「bin」,例如:
CREATE TABLE user (
name varchar(100)
) COLLATE utf8_general_bin ;
以上三個區分大小寫的方法 scope 差異頗大的,可以挑比較適合當下情況的方法來使用。