ACCESSnode-mysql文档翻译

模块Github地址

安装

npm install mysql

倘欲先的本0.9.x多样之文档,请看v0.9 branch.
突发性你得自github中设置新型版本的node-mysql,具体怎么开要参考下面的言传身教:

npm install felixge/node-mysql

介绍

即时是一个node.Js的mysql驱动程序。这个叫完全是故javascript写的,不欲其他编译工作。完全的信守MIT开源协议。
这里发生一个概括的演示告诉您什么以它:

var mysql = require('mysql');
var connection = mysql.createConnection({
  host : 'localhost',
  user : 'me',
  password : 'secret'
});

connection.connect(); //建立连接
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
  if (err) throw err;
  console.log('The solution is: ', rows[0].solution);
});

connection.end(); //释放连接

自从地方这事例中,你当使掌握如下的一定量触及:

  1. 每个方法调用在连接队列中凡是据梯次执行。
  2. 当使用 end()
    函数关闭连接时,你必须使保证您的保有查询都早已发送给了mysql服务器。否者end()之后的查询是废的。

创造连接

引进的等同种连接方式:

var mysql = require('mysql');var connection = mysql.createConnection({
  host : 'example.org',
  user : 'bob',
  password : 'secret'
});

connection.connect(function(err) {
// 成功连接! (unless err is set)
});

只是,一个老是只能隐式的调用一个query函数。调用方式如下:

var mysql = require('mysql');
var connection = mysql.createConnection(...);

connection.query('SELECT 1', function(err, rows) {
// 成功连接! (unless err is set)
});

点的有限种植错误处理方法都正好,这在你还爱那无异栽方法来举行数据库错误信息处理。任何一样种连接达的错误(握手及网络)都见面吃视为致命错误,具体还多之错误处理信息可以查看Error
Handling章节。

连天而挑选参数

当我们以Node-MySQL建立一个数据库连接的下你可由此下面这些选择:

参数名 代表值
host 数据库的主机名(默认: localhost
port 数据库服务器的端口(默认: 3306)
localAddress 使用TCP连接的源IP地址(可选)
socketPath 使用Unix域套接字连接的路径,当使用 host 与 port 的时候可以忽略。
user 这个是MySQL身份验证的用户名。
password MySQL用户的密码。
database 连接的数据库名(可选).
charset 连接之后的字符编码(默认:’ UTF8_GENERAL_CI’,值得提醒的是,这个值必须都是大写字母).
timezone 这个是储存数据的是当前时间。(默认:local).
connectTimeout MySQL初始连接的超时时间。单位是毫秒(默认:无超时限制)。
stringifyObjects 把值转换为 Stringify 对象。(默认:false)。
insecureAuth 允许使用老(不安全)的身份认证方式去连接MySQL数据库.(默认: false).
typeCast 是否把结果值转换为原生的 javascript 类型(默认: true).
queryFormat 一个可以自己定义查询格式函数(具体见Custom format)。
supportBigNumbers 当在数据库中处理一个大数(BIGINT和DECIMAL)数据类型的时候,你需要启用这个选项(默认: false).
dateStrings 强制为date类型(TIMESTAMP,DATETIME,DATE)转化为一个字符串返回而不是转换成 javascript的date类型对象。(默认: false)
debug 答应协议详细信息到标准输出(默认: false).
trace 产生栈跟踪当在库的入口点出现error时,当调用数次很多时性能会略微下降(默认: true).
multipleStatements 允许每个mysql语句有多条查询.使用它时要非常注意,因为它很容易引起sql注入攻击(默认:false).
flags 使用连接标示符号标示出超过默认的值的连接。它也可以加到默认的黑名单连接中。更多信息参考(Connection Flags)。
ssl 使用ssl参数对象(格式参考crypto.createCredentials参数)或者是用一个包含ssl配置的字符串名。目前仅仅支持亚马逊的ca证书,参考:https://rds.amazonaws.com/doc/rds-ssl-ca-cert.pem
bigNumberStrings 这个选项需要bigNumberStrings与 supportBigNumbers同时启用,强制把数据库中大数(BIGINT和DECIMAL)数据类型的值转换为javascript字符对象串对象返回。(默认:false)。当启用supportBigNumbers选项,但 bigNumberStrings是未启用的状态。当无法用javascript数字对象(JavaScript Number objects)所表达的时候就会返回的是一个big number字符串对象(值的范围要在 [-253, +253]之间).否则将会返回一个Number类型的对象。如果supportBigNumbers是false那么这个选项会被自动忽略。

除此之外利用这些选择来做靶子下,你啊得就此一个字符串来标示。例如:

var connection = mysql.createConnection('mysql://user:pass@host/db?debug=true&charset=BIG5_CHINESE_CI&timezone=-0700');

专注:查询出来的价第一会见尝试换为json格式,如果换失败.那么就见面变成为纯文本的字符串.

闭馆连接

起个别栽关闭连接的方法,当查问好后最优雅关闭连接方式是调用end()方法,例如:

connection.end(function(err) {
// 连接在这里会被终止
});

这样好管以查询队列完成后发送一个 COM_QUIT
包到mysql服务器。如果以发送 COM_QUIT
出现致命之荒唐。在回调函数里面有一个err参数可以采用。但是这连续无论如何也会叫关掉。

除此以外一栽替代end()方法的是调用destroy()方法,这个方法会立即停下底层socket连接.destroy()方法确保了无其他事件或回调再连触发。

connection.destroy();

destroy()方法不像end()方法, destroy()方法是未曾其他回调参数的。

连接池

直白以连接池

var mysql = require('mysql');
var pool = mysql.createPool({
  host : 'example.org',
  user : 'bob',
  password : 'secret'
});

pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
  if (err) throw err;
  console.log('The solution is: ', rows[0].solution);
});

接连可以任意的共享一个连连要是管理几近只连续:

var mysql = require('mysql');
var pool = mysql.createPool({
  host : 'example.org',
  user : 'bob',
  password : 'secret'
});
pool.getConnection(function(err, connection) {
// 连接成功! (除非有err )
});

使你想当连前安设session变量并且得到使用。你可以监听connection事件:

pool.on('connection', function(connection) {
  connection.query('SET SESSION auto_increment_increment=1')
});

当你的连年形成后,只需要调用connection.release()方法。将连接返回到池塘中,以供其他人再用。

var mysql = require('mysql');
var pool = mysql.createPool(...);
pool.getConnection(function(err, connection) {
  // 使用连接
connection.query( 'SELECT something FROM sometable', function(err, rows) {
  // 连接使用完成后释放连接
  connection.release();
    // 不要在这里使用connection进行查询,因为连接已经被归还到连接池了
  });
});

若是你想关闭连接而由连池中移除,使用connection.destory()方法代替。当您下一样不好用运用的时节,池会自动创建一个新的连日。
经过塘创建连接是怪慢的。如果你安排你的连接池最深的连接数为100,当您不过待而使用5独连续上,它为止只是见面创造5单连续。这种连的轮回方式是一样栽轮询(round-robin)的艺术。采取的凡自从连接池顶部及底层的方法。

Pool参数选项

池连可以领一些老是的参数选项。当一个一连创建之后,这些参数选项通过简单的组织传递至连里面。池连接参数可以领下面这些参数。waitForConnections:判断时之连年是否可用并且是否都高达了连接数的上限。如果是true。这个连续就会进入到连续队列中并且把状态转换为可用状态。如果是false,那么会立即回到一个荒谬受开发者。(默认:true).connectionLimit:一不成连续最特别之连接数(默认:10)。queueLimit:从getConnection获取连接数并且判断是否超过了queneLimit限制的排队等候的连日值,如果是就回到一个谬误。如果设置为0,就是不限量连队列数(默认:0)。

PoolCluster

PoolCluster提供了差不多大主机连接功能(group&retry&selector):

// 创建连接
var poolCluster = mysql.createPoolCluster();
poolCluster.add(config); // anonymous group
poolCluster.add('MASTER', masterConfig);
poolCluster.add('SLAVE1', slave1Config);
poolCluster.add('SLAVE2', slave2Config);

// 目标主机组 : ALL(anonymous, MASTER, SLAVE1-2), 连接方式 : round-robin(default)
poolCluster.getConnection(function (err, connection) {});

// 目标主机组 : MASTER, 连接方式: round-robin
poolCluster.getConnection('MASTER', function (err, connection) {});

// 目标主机组 : SLAVE1-2, 连接方式 : order
// 如果不能连接到SLAVE1就连接SLAVE2(把SLAVE1从集群节点中删除)
poolCluster.on('remove', function (nodeId) {
  console.log('REMOVED NODE : ' + nodeId); // 节点ID= SLAVE1 
});

poolCluster.getConnection('SLAVE*', 'ORDER', function (err, connection) {
});

// 命名方式: of(pattern, selector)
poolCluster.of('*').getConnection(function (err, connection) {
});

var pool = poolCluster.of('SLAVE*', 'RANDOM');
pool.getConnection(function (err, connection) {
});

pool.getConnection(function (err, connection) {
});

// 释放连接
poolCluster.end();

PoolCluster选项

参数名 代表值
canRetry 如果是true,当连接失败时Poolcluster会尝试重新连接(默认:true)。
removeNodeErrorCount 如果连接失败,节点的errorCount将会增加.当errorCount大于removeNodeErrorCount时,会从poolCluster中移除一个节点。(默认:5).
defaultSelector 默认选择器(默认:RR).
RR 选择一个交替(轮循)
RANDOM 由随机函数选择一个节点.
ORDER 按照顺序无条件的选择第一个节点。
var clusterConfig = {
  removeNodeErrorCount: 1, // 连接失败后立即从把该节点移除
  defaultSelector: 'ORDER'
};

var poolCluster = mysql.createPoolCluster(clusterConfig);

切换用户/修改连接状态

MySQL提供了ChangeUser的下令,允许而转移当前用户同时切换用户时时莫待关闭底层socket连接:

connection.changeUser({user : 'john'}, function(err) {
  if (err) throw err;
});

这效果提供了几独有效的参数选项:

参数名 代表值
user 新用户的名字。(默认为切换新用户前第一个用户)
password 新用户的密码(默认为切换新用户前第一个用户)
charset 新的字符编码(默认为切换新用户前第一个用户)
database 新的数据库名(默认为切换新用户前第一个用户)

夫作用有时有一个副作用,它见面管所有的连状态且重置(变量,事务).
留意:此操作出现的谬误会受欠模块视为致命错误处理。

服务器连接断开

鉴于网络问题你发或有失与MySQL服务器的连年。也发生或为服务器踢来连接,还来或是服务器又开或是崩溃等等,这些还是沉重之缪都给归为error对象中。并且模块提供了err.code
= ‘PROTOCOL_CONNECTION_LOST’信息,更多之错误处理信息请参考Error
Handling 。
和服务器重连是建一个初的连,一旦现在的连天断开就非克为这连续重新连接。它要另行成立平等长连接,连接受数据库服务器。
每当连接池之中,当连接断开时会面自连接池里面把连接移除,当下次需连续的下调用getConnection创建一个初的总是。

转义查询值

为避免为SQL注入攻击,你得把用户提交过来的数额开展转义之后再次坐SQL查询语句里面。模块提供了connection.escape()和Pool.escape()两栽方法:

var userId = 'some user provided value';
var sql = 'SELECT * FROM users WHERE id = ' + connection.escape(userId);
connection.query(sql, function(err, results) {
  // ...
});

要么,你得采取占位符’?’来代替,同样的也能够针对传播的价进行转义:

connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) {
  // ...
});

眼看看起如是动了MySQL的先期处理语句,其实同样的以MySQL内部也是应用了接近connection.escape()的章程。
差的凡路转义的价值不同。请圈下面的讲:

  1. Number类型保存不变.
  2. Boolean值被转移为true/false字符串.
  3. Date类型被转换为’YYYY-mm-dd HH:ii:ss’字符串
  4. Buffer转换为了16进制,例如:X’0fa5′
  5. String转换为安全的字符串。
  6. Array转换为list。例如:[‘a’,’b’]会返回’a’,’b’
  7. 差不多维数组会被撤换为多维list。例如[[‘a’, ‘b’], [‘c’,
    ‘d’]]返回(‘a’, ‘b’), (‘c’, ‘d’)
  8. Object转换为key = ‘val’;多维Object对象见面更换为字符串.
  9. undefined/null会转换为null
  10. NaN / Infinity
    保持不移,因为MySQL现在并无支持这些目标,如果你将NaN/Infinity做呢价值,MySQL会报错.直到其为MySQL支持。

倘你放在心上了,你见面发觉转义查询值可以巧妙的之所以脚这种方法:

var post = {id: 1, title: 'Hello MySQL'};
var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
  // 非常完美!
});
console.log(query.sql); // INSERT INTO posts SET id = 1, title = 'Hello MySQL'

只要您道出必要自己失去转义查询值,那么您可一直去调用转义函数:

var query = "SELECT * FROM posts WHERE title=" + mysql.escape("Hello MySQL");
console.log(query); // SELECT * FROM posts WHERE title='Hello MySQL'

转义查询标示符
倘若您免信任用户提交过来的标示符((database / table / column
name))。那么您需要利用mysql.escapeId(identifier)来转义:

var sorter = 'date';
var query = 'SELECT * FROM posts ORDER BY ' + mysql.escapeId(sorter);
console.log(query); // SELECT * FROM posts ORDER BY date

它们还支持添加合格的转义符。不过得管转义的分成两组成部分:

var sorter = 'date';
var query = 'SELECT * FROM posts ORDER BY ' + mysql.escapeId('posts.' + sorter);
console.log(query); // SELECT * FROM posts ORDER BY posts.date

或者,你可以应用占位符’??’,它见面自行转义查询的价值:

var userId = 1;
var columns = ['username', 'email'];
var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function(err, results) {
  // ...
});
console.log(query.sql); // SELECT username, email FROM users WHERE id = 1

要小心:最后之一个字符转义目前还当试行等,而且语法随时可能有改变。

当你使用.escape(),.query(),.escapeId()时方可中之防守SQL注入攻击.

预查询

乃可利用mysql.format()去执行预处理多嵌套查询语句,利用恰当的转义处理对标示符与值.下面有一个大概的例子:

var sql = "SELECT * FROM ?? WHERE ?? = ?";
var inserts = ['users', 'id', userId];
sql = mysql.format(sql, inserts);

这种艺术好管发送到数据库进行数据查询前就是能够保证查询语句之平安,在发送到数据库查询之前执行预查询,这个功效很的得力。
由mysql.format是由sql的String.format暴露出的。所以若可以你还可以选择传递stringifyObject
和timezone对象(不强制要求)。
并且同意而于定义把对象转换字符串的章程。以及特定地区的年华及时区(location
specific/timezone aware Date).

自从定义格式

假设你喜欢其他样式的转义格式。你得当连配置选中于定义你的效应函数。如果您还眷恋行使escape()或外内置的函数。可以一直调用
这儿我们提供了一个演示:

connection.config.queryFormat = function (query, values) {
  if (!values) return query;

  return query.replace(/:(\w+)/g, function (txt, key) {
    if (values.hasOwnProperty(key)) {
      return this.escape(values[key]);
    }
    return txt;
  }.bind(this));
};
connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });

得插入值之后的ID

而你想获得插入一行值之后,获取活动递增主键的ID。你可如此获取:

connection.query('INSERT INTO posts SET ?', {title: 'test'}, function(err, result) {
  if (err) throw err;
  console.log(result.insertId);
});

当处理非常数字的当儿(超过javascriptNumber类型的精度),你要启用supportBigNumbers以便将ID作为字符串类型读取。否者会丢弃来错误.
同时当由数据库被查询的数字是一个big
number类型的早晚,你吗需要把supportBigNumbers选项设置也true,否则查询出来的数码以传输过来的下由于精度限制,自动删除超出部分。

实行并行查询

MySQL的商谈是逐一执行的。所以这虽意味着这你要建立多只连去落实互动查询,你当用一个塘(Pool)来管理总是。一个粗略的措施就是每一个连接都创的一个HTTP请求连接.

数据流查询

有时候,你或许失掉实践一个百般之查询,并且要拍卖查询返回的各一行结果。那么你可尝尝这样做:

var query = connection.query('SELECT * FROM posts');
query.on('error', function(err) {
  // 处理错误,当出现错误时,会立即发出一个end事件
  }).on('fields', function(fields) {
    // the field packets for the rows to follow
  }).on('result', function(row) {
    // 处理工程中涉及到I/O可以在这里先暂停连接
    connection.pause();
    processRow(row, function() {
    connection.resume();
    });
  }).on('end', function() {
    // 获取所有查询内容
  });

当面的例证中要留意几件工作:

  1. 同常的上你期望当接到至得数量之询问结果的时候再实行pause()方法,这数据在你询问总的多寡以及多少的大大小小。
  2. pause()/resume()操作底层socket和解析器时,可以规定于调用pause()方法之后再也发result事件给执行。
  3. 当起差不多漫漫数据流读取时,不能够还被query()方法上加一个回调函数。
  4. 在’result’事件备受不仅可以回来查询的多少也可确认query/INSERT执行是否成功。
  5. 除开,你该发趣味知道当前底模块并无支持单独一行的流读取。它们还是深受缓存起来当SQL执行了事后一律连将结果回到过来。假如你生当大型的案例中应用至了MySQL的流技术。我颇想念能够跟君分享。

管道结果(Piping results)和Streams2

query对象提供了一个特别便宜的方法.stream(可选).它将询问事件封装成了可是读(Readable)的Streams2对象,此流可以死容易地通过管道downstream,并提供自动化暂停/恢复,基于downstream堵塞以及可选highWaterMark。该流的objectMode参数默认设为true

比如说,把询问结果经piping导入到另外一个流中(最要命缓存为5)的简要例子:

connection.query('SELECT * FROM posts')
.stream({highWaterMark: 5})
.pipe(...);

差不多报句询问

由安全着想,多报句询问默认是剥夺的.(如果值没有经过转义,那么深有或会见招SQL注入攻击)。如果您想采取这个作用,你必须以连年着启用其:

var connection = mysql.createConnection({multipleStatements: true});

假定启用,你不怕好执行多长达告句子询问了。例如:

connection.query('SELECT 1; SELECT 2', function(err, results) {
  if (err) throw err;
  // results is an array with one element for every statement in the query:
  console.log(results[0]); // [{1: 1}]
  console.log(results[1]); // [{2: 2}]
});

除此以外,您吗可以拧行理的多只报告词询问的结果:

var query = connection.query('SELECT 1; SELECT 2');

query.on('fields', function(fields, index) {
  // the fields for the result rows that follow
}).on('result', function(row, index) {
  // index refers to the statement this result belongs to (starts at 0)
});

设您有一个查询语词出现了不当,那么抛来之错误会蕴藏在err.index属性里面还要会告知你是哪条告句出现了错误。同时当起误时对余下的查询语句MySQL也会见已执行.

顾:目前下流来执行多长查询语词的接口还以考阶段。所以自己好期待能够得到你的汇报。

存储过程

君得于公的查询语句里面调用MySQL驱动着打带的其他存储过程,如果您采取存储过程生成的大半个结实集,其实也即和公运多告句子查询生成得出的结果是同等的。

合并重叠的字段

当我们运用JOIN函数执行查询的时刻获得的结果中有多字段是再度的。默认情况下Node-MySQL会按照列读博顺序把部分冲之列名进行联合。但是这样来或会见导致部分吸收到的价值变得无可用。
然而,您可以指定在表名中嵌套您要之排,就像这样:

var options = {sql: '...', nestTables: true};
connection.query(options, function(err, results) {
  /* 结果将会像下面这样的数组形式返回: 
  [{
  table1: {
    fieldA: '...',
    fieldB: '...',
  },
  table2: {
    fieldA: '...',
    fieldB: '...',
  }, 
  }, ...]
  */
});

或您得应用字符串分隔符合并化作你想只要之结果:

var options = {sql: '...', nestTables: '_'};
connection.query(options, function(err, results) {
/* 
results will be an array like this now: 
[{ 
  table1_fieldA: '...',
  table1_fieldB: '...',
  table2_fieldA: '...',
  table2_fieldB: '...',
},...]
*/
});

事务处理

当连年层中得支持简的事务处理:

connection.beginTransaction(function(err) {
  if (err) { throw err; }
  connection.query('INSERT INTO posts SET title=?', title, function(err, result) {
    if (err) { 
      connection.rollback(function() {
        throw err;
      });
    }

    var log = 'Post ' + result.insertId + ' added';
    connection.query('INSERT INTO log SET data=?', log, function(err, result) {
      if (err) { 
        connection.rollback(function() {
          throw err;
        });
      }

      connection.commit(function(err) {
        if (err) { 
          connection.rollback(function() {
            throw err;
          });
        }
        console.log('success!');
      });
    });
  });
});

恳请留意,执行START TRANSACTION, COMMIT,和 ROLLBACK
这些简单命令的法分别是transaction(),Commit()和rollback(),了解MySQL中有些晤招致隐式提交报告句很重大。

错误处理

夫模块包含了错误处理机制,不过当编码的时节你还应去好检查自己之代码。看看是不是会见发一些奇怪的谬误。
是模块中持有的一无是处还是javascript error的对象实例,同时她还有一定量只属性:

  1. err.code: 任一的MySQL错误 MySQL server error (例如.
    ‘ER_ACCESS_DENIED_ERROR’), Node.js错误 (例如.’ECONNREFUSED’)
    或者是中间错误 (e.g. ‘PROTOCOL_CONNECTION_LOST’).

  2. err.fatal:布尔值,这个目标表示是否能连续至服务器.

致命的错都得以回调函数中捕获到。在脚是例子中,所引起的荒唐是因改连接试图连接到一个不行的端口上面。因此错误对象见面给传送至回调函数中还要会运用err.code或err.fatal知道错的具体情况:

var connection = require('mysql').createConnection({
  port: 84943, // WRONG PORT
});

connection.connect(function(err) {
  console.log(err.code); // 'ECONNREFUSED'
  console.log(err.fatal); // true
});

connection.query('SELECT 1', function(err) {
  console.log(err.code); // 'ECONNREFUSED'
  console.log(err.fatal); // true
});

诚如情形下错是独委托给她所属的回调函数,例如下面这例子。只有首先单回调函数接收到了错误信息,而第二独一样是本预期的措施实施的连无见面捕获第一只查询的不当:

connection.query('USE name_of_db_that_does_not_exist', function(err, rows) {
  console.log(err.code); // 'ER_BAD_DB_ERROR'
});

connection.query('SELECT 1', function(err, rows) {
  console.log(err); // null
  console.log(rows.length); // 1
});

末尾值得提示的是,有时候你可以管错误处理不居同查询并的回调函数里面,就像上面的特别例子。你得管错误处理放在连接对象及之不当事件里。就如下这样:

connection.on('error', function(err) {
  console.log(err.code); // 'ER_BAD_DB_ERROR'
});

connection.query('USE name_of_db_that_does_not_exist');

注意:error在Node中是一个破例之靶子,如果她从未给高悬在一个事变及而是单独出现,那么就算非常有或出现堆栈错误而关闭NodeJS程序上程.
终极:这个模块处理错误的初衷都未是冷的拍卖掉错误,你应当拿错的拍卖在回调函数里面。但是要您免爱好这样辛苦而忽略掉错误。那么您可以这么做:

// I am Chuck Norris:
connection.on('error',function(){
  //...
});

那个安全处理

是模块的非常处理非常安全,也就是说在回调函数中丢掉来一个破绽百出后您可行使’uncaughtException‘或域(domain)去捕获错误,然后继续的失行使做下的事情。

类型转换

为了您的使用方面,这个让会活动将MySQL中的一对类型转换为原生的javascript的类型。下面列举的凡移的项目:
Number:

  • TINYINT
  • SMALLINT
  • INT
  • MEDIUMINT
  • YEAR
  • FLOAT
  • DOUBLE

Date:

  • TIMESTAMP
  • DATE
  • DATETIME

Buffer:

  • TINYBLOB
  • MEDIUMBLOB
  • LONGBLOB
  • BLOB
  • BINARY
  • VARBINARY
  • BIT (最后一个字节会要用0来填充)

String:

  • CHAR
  • VARCHAR
  • TINYTEXT
  • MEDIUMTEXT
  • LONGTEXT
  • TEXT
  • ENUM
  • SET
  • DECIMAL (可能会见越float精度)
  • BIGINT (可能会见跳float精度)
  • TIME (转换为日期, but what date would be set?)
  • GEOMETRY (从来不曾用错,当你用的时光你得联系我们)

俺们无建议您拿类型转换这个参数经用,但是如果您想禁用也堪当连的早晚便错过举行(这种方式或者于后来的本中除去/改变):

var connection = require('mysql').createConnection({typeCast:false});

要么当查询层做:

var options = {sql: '...', typeCast: false};
var query = connection.query(options, function(err, results) {

});

而啊得透过一个处理函数来转换自己想只要之花色,通过已知道的一些字段的音讯,像数据库,表名和许段名,数据类型和长短。如果您就想协调定义一个类型转换函数。你可于询问的回调函数中做。例如你把TINYINT(1)转换为布尔值:

connection.query({
sql: '...',
typeCast: function (field, next) {
if (field.type == 'TINY' && field.length == 1) {
return (field.string() == '1'); // 1 = true, 0 = false
}
return next();
}});

警示:你不能不使用解析器中内修筑之老三单field函数中之一个,在你打定义之类型转换回调函数惨遭。他们只好调用一潮:

field.string()
field.buffer()
field.geometry()
//或者使用别名:
parser.parseLengthCodedString()
parser.parseLengthCodedBuffer()
parser.parseGeometryValue()

假如你需要使用field函数,。你得于RowDataPacket.prototype._typeCast中找到关于field函数的有文档资料

连续标记

若,由于某些原因而需要修改默认的连标记,那么您或需要动用flags选项。通过当接连配置的抉择项列表中丰富这个选项,那么你就是可改默认的连天标记.如果你无思使默认的flag你可以使用一个减号来取消掉。或者当连的布选列表中加加一个flag选项,而非写值,仅仅就是是一个flag名字在哪(不区分轻重缓急写)。
PS:不思量像失去掉flag选项一样当flag的前加一个+号:

请求小心:有些默认的flag目前尚无支持(例如:SSL,Compression)。

例子:
脚的例证是采取黑名单FOUND_ROWS flag例子:

var connection = mysql.createConnection("mysql://localhost/test?flags=-FOUND_ROWS");

默认标记:

  • LONG_PASSWORD
  • FOUND_ROWS
  • LONG_FLAG
  • CONNECT_WITH_DB
  • ODBC
  • LOCAL_FILES
  • IGNORE_SPACE
  • PROTOCOL_41
  • IGNORE_SIGPIPE
  • TRANSACTIONS
  • RESERVED
  • SECURE_CONNECTION
  • MULTI_RESULTS
  • MULTI_STATEMENTS (如果用 multipleStatements 选项就激活)

另的可用标记:

  • NO_SCHEMA
  • COMPRESS
  • INTERACTIVE
  • SSL
  • PS_MULTI_RESULTS
  • PLUGIN_AUTH
  • SSL_VERIFY_SERVER_CERT
  • REMEMBER_OPTIONS

调剂和问题查看

假使在运转过程中起了问题,你可以当连的部署选中补充加一个debug参数来协助而调试:

var connection = mysql.createConnection({debug: true});

它会用输入的音信及输出的音讯标准输出的来得出,你还可由此将数据包的类型转换成一个数额数组对象来便于调试:

var connection = mysql.createConnection({debug: ['ComQueryPacket', 'RowDataPacket']});

相关文章