拜託跟我說一下這樣是正確還是錯誤,難不成要我通靈嗎???
作者: 日落
MySQL 透過 LOAD DATA 塞資料
若有文字檔等大檔案,寫 parser 再建立 insert into
的語法來塞資料速度不算快。簡單格式的檔案 (如一行一筆資料或 comma 分隔等) 可以透過 LOAD DATA
來將資料塞進 table 中。
LOAD DATA 需要特殊權限,請先檢查 my.cnf
檔案中是否已允許該語法:
[mysql] # enable LOAD FILE syntax local-infile = 1
再來是檔案內容,這邊的範例是一行一筆資料:
alice bob cell ......
確定資料格式以後,建立一個暫時的 table 供匯入使用:
CREATE TABLE tmp ( str varchar(50) );
注意,匯入速度要快的話,臨時的 table 不要設定任何 trigger
、primary key
、index
等,不然會有大量的 disk I/O 拖慢速度。
最後就是下指令來將檔案中的內容匯入資料庫中:
LOAD DATA LOCAL INFILE '/path/to/file/simple-data.txt' into table tmp;
資料都匯入臨時的 table,就可以使用 INSERT INTO
… SELECT 語法來將資料拉進正式環境了:
INSERT INTO words (`word`) SELECT (`str`) FROM tmp
OXOPO 1.5v 充電 鋰電池
產生短網址的 string ID
在約 15 年前有嘗試想要自己做一個縮網址服務 (現在我做加長網址服務 XD),當時用來產生 string ID 的方法有弱點,被學弟抓出來打爆 (可以被預測下一個產生出來的 ID,然後建立 unliminted redirection)。最近摸到 crunch 這個工具,在重新思考以後,終於搞清楚向 ppt.cc 請教時得到的說明是什麼意思。
先說明有問題的作法,先建立 valid characters list,URL 有部份特出字元是 reserve character (RFC3986),所以像是 ?
、=
、@
等字元有特殊用途不能被拿來當作參數傳遞,然後做「N 進位」轉成 string ID:
<?php $char = ['a', 'b', 'c', '.....', '7', '8', '9', '0'];
例如:數字是 1
時,產生出來的 ID 是 a
、數字是 116
時產生出來的 ID 是 a1
。當時我是依照流水號,所以 ID 是可以被預測的,導致弱點被利用。
當時得到 ptt.cc 的回覆是「先產生完 key 再隨機選取可用的 key」。
這陣子才搞懂這個說明,先用 crunch 之類的工具把所有可用的 string 都先產生出來,然後需要時再隨機選取一個 string 來當作 key/ID 使用。這個作法有些優點:
- 不需要先產生所有的 key,因為大概可以推算出大概可用的 ID 數量
- 隨機挑選 key 就無法被猜到未來會被用到的 key,不容易被攻擊
接下來要傷腦筋的,大概就是怎麼樣有效率的從 DB 隨機取 key 了。
ps. 目前使用 3 個 digits,大概就有 20 多萬個 unique string 可用了,爽。
在 SQL server 建立 Linked Database 連線到 MySQL
SQL server 並不支援 MySQL 連線或查詢,但可以透過 ODBC 和 SQL server 的「Linked Database」功能將 query 轉送至 MySQL 執行。
SQL server 是透過 MSDASQL 功能來與 ODBC 連線,所以建立連線前要先做好 ODBC 資料來源設定和 MSDASQL 的設定。ODBC 的 MySQL 來源設定可以參考弊站稍早「安裝 MySQL ODBC driver」的說明,MSDASQL 的設定必須先透過 SSMS 的 sa 帳號,從「物件總管」=>「伺服器物件」=>「連結的伺服器」=>「提供者」=>「MSDASQL」點選右鍵,檢視「屬性」,檢查是否需要特殊的設定 (一般用途使用預設值即可):
確認 MSDASQL 的參數均正確後,在「連結的伺服器」點選右鍵「新增連結的伺服器」開始設定新的連線。在資料來源選項中要注意「提供者 (provider)」必須選擇「ODBC drivers」,資料來源的名稱必須與 ODBC 中的資料來源名稱一致 (注意名稱中的英文大小寫及符號):