
拜託跟我說一下這樣是正確還是錯誤,難不成要我通靈嗎???
軟體開發、伺服器和生活瑣事
拜託跟我說一下這樣是正確還是錯誤,難不成要我通靈嗎???
若有文字檔等大檔案,寫 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
在約 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 使用。這個作法有些優點:
接下來要傷腦筋的,大概就是怎麼樣有效率的從 DB 隨機取 key 了。
ps. 目前使用 3 個 digits,大概就有 20 多萬個 unique string 可用了,爽。
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 中的資料來源名稱一致 (注意名稱中的英文大小寫及符號):