node-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堵塞和可选high沃特er马克。该流的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']});

相关文章