首页 > 解决方案 > NodeJS MySQL 模块的 escape()/escapeId() 方法是如何工作的?

问题描述

我正在尝试了解 NodeJS 模块的转义方法(以构建该模块的我的版本),它是仅删除元字符/特殊字符还是有所不同?

标签: mysqlnode.js

解决方案


mysql pacakge使用sqlstringescapeescapeId方法。

您可以检查源代码以了解它是如何工作的。

escape

  • 数字保持不变
  • 布尔值转换为true/false
  • 日期对象转换为'YYYY-mm-dd HH:ii:ss'字符串
  • 缓冲区被转换为十六进制字符串,例如X'0fa5'
  • 字符串被安全转义
  • 数组变成列表,例如['a', 'b']变成'a', 'b'
  • 嵌套数组变成分组列表(用于批量插入),例如[['a', 'b'], ['c', 'd']]变成('a', 'b'), ('c', 'd')
  • 具有toSqlString方法的对象将.toSqlString()被调用,并且返回值用作原始 SQL。
  • 对于对象上的每个可枚举属性,对象都会变成key = 'val'对。如果属性的值是一个函数,则跳过它;如果属性的值是一个对象,则对其调用 toString() 并使用返回的值。
  • undefined / null被转换为NULL
  • NaN / Infinity保持原样。MySQL 不支持这些,并且尝试将它们作为值插入将触发 MySQL 错误,直到它们实现支持。

escapeId

  • 数组变成列表,例如['a', 'b']变成'a', 'b'
  • 字符串被安全转义

安全转义字符串:

{
  '\0'   : '\\0',
  '\b'   : '\\b',
  '\t'   : '\\t',
  '\n'   : '\\n',
  '\r'   : '\\r',
  '\x1a' : '\\Z',
  '"'    : '\\"',
  '\''   : '\\\'',
  '\\'   : '\\\\'
};

推荐阅读