npm install mysql # 穩定版
npm install felixge/node-mysql # 最新版
const mysql = require('mysql');
const conn = mysql.createConnection({
host: 'example.org',
user: 'bob',
password: 'secret',
database: 'mydb'
});
conn.connect(err => {
if (err) return console.error('連接失敗:', err.stack);
console.log('已連接,threadId:', conn.threadId);
});
| 選項 | 默認值 | 說明 |
|---|---|---|
| host | localhost | 主機地址 |
| port | 3306 | 端口 |
| charset | UTF8_GENERAL_CI | 字符集(大寫) |
| timezone | local | 時區 |
| connectTimeout | 無限制 | 毫秒 |
| supportBigNumbers | false | 支援 BIGINT/DECIMAL |
| bigNumberStrings | false | 強制大數以字符串返回 |
| dateStrings | false | 日期類型以字符串返回 |
| multipleStatements | false | 允許單 query 多語句 |
conn.end(cb):等待進行中查詢完成後優雅關閉。conn.destroy():立即強制斷開,無回調。// 1. 簡單 SQL + 回調
conn.query('SELECT * FROM books WHERE author = "David"', (err, rows, fields) => { ... });
// 2. 佔位符 ? 防注入
conn.query('SELECT * FROM books WHERE author = ?', ['David'], (err, rows, fields) => { ... });
// 3. 選項對象(超時、類型轉換等)
conn.query({ sql: 'SELECT * FROM books WHERE author = ?', timeout: 40000, values: ['David'] }, (err, rows, fields) => { ... });
// 手動轉義
const sql = 'SELECT * FROM users WHERE id = ' + conn.escape(userId);
// 佔位符自動轉義(推薦)
conn.query('SELECT * FROM users WHERE id = ?', [userId], cb);
// 對象語法自動展開
const post = {id: 1, title: 'Hello MySQL'};
conn.query('INSERT INTO posts SET ?', post, cb);
// 生成: INSERT INTO posts SET `id`=1, `title`='Hello MySQL'
// 手動
const sql = 'SELECT * FROM posts ORDER BY ' + conn.escapeId(sorter);
// 佔位符 ??
conn.query('SELECT ?? FROM ?? WHERE id = ?', [['username','email'], 'users', userId], cb);
// 生成: SELECT `username`,`email` FROM `users` WHERE id = 1
conn.config.queryFormat = (query, values) => {
if (!values) return query;
return query.replace(/:(\w+)/g, (_, key) => values.hasOwnProperty(key) ? conn.escape(values[key]) : _);
};
conn.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });
result.insertId:自增主鍵 ID(大數啟用 supportBigNumbers 以字符串讀取)。result.affectedRows:影響行數(INSERT/UPDATE/DELETE)。result.changedRows:實際改變的行數(不含值未變的行)。conn.threadId:連接線程 ID。multipleStatements: true)
conn.query('SELECT 1; SELECT 2', (err, results) => {
// results[0] → [{1:1}], results[1] → [{2:2}]
});
// 事件流模式
conn.query('SELECT 1; SELECT 2')
.on('fields', (fields, index) => { ... })
.on('result', (row, index) => { ... });
錯誤時 err.index 指示第幾條語句出錯,後續語句停止執行。
Error 實例,含 err.code(MySQL 錯誤碼/Node 錯誤碼/內部協議碼)與 err.fatal(是否終結連接)。connection.on('error')。conn.on('error', ...)**。
// 統一錯誤監聽
conn.on('error', err => console.error('DB Error:', err.code));
mysql.createPool(),而非單連接。?/??,杜絕字符串拼接。supportBigNumbers + bigNumberStrings 處理 BIGINT/DECIMAL。error 事件防止進程意外退出。timeout 選項 + 連接級 connectTimeout。