Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NodeJS MySQL模块的escape()/escapeId()方法是如何工作的?_Mysql_Node.js - Fatal编程技术网

NodeJS MySQL模块的escape()/escapeId()方法是如何工作的?

NodeJS MySQL模块的escape()/escapeId()方法是如何工作的?,mysql,node.js,Mysql,Node.js,我试图理解NodeJS模块的转义方法(为了构建该模块的我的版本),它只是删除了元字符/特殊字符,还是做了一些不同的事情?pacakge使用package进行转义和转义方法 你可以看看它是如何工作的 转义: 数字保持不变 布尔值被转换为true/false 日期对象转换为'YYYY-mm-dd HH:ii:ss'字符串 缓冲区转换为十六进制字符串,例如X'0fa5' 绳子安全地逃脱了 数组转换为列表,例如['a','b']转换为'a','b' 嵌套数组被转换成分组列表(用于批量插入),例如,[[

我试图理解NodeJS模块的转义方法(为了构建该模块的我的版本),它只是删除了元字符/特殊字符,还是做了一些不同的事情?

pacakge使用package进行
转义
转义
方法

你可以看看它是如何工作的

转义

  • 数字保持不变
  • 布尔值被转换为
    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(),并使用返回的值
  • 未定义/null
    转换为
    null
  • NaN/Infinity
    保持原样。MySQL不支持这些,尝试将它们作为值插入将触发MySQL错误,直到它们实现支持为止
转义ID

  • 数组转换为列表,例如
    ['a','b']
    转换为
    'a','b'
  • 绳子安全地逃脱了
安全逃生绳:

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

如果您谈论的是package,它将package用于
escape
escapeId
方法。你也可以用它来构建你的模块,而不是自己实现。是的,但这也是一项个人研究,我想知道这背后是什么。我在node_模块中搜索了SqlString模块,没有发现任何内容,因此,我决定在这里提问。为什么要为这样一个关键组件创建自己的版本,而不是使用经过良好测试的版本?@t.niese这个问题也是个人研究,我想知道它是如何工作的,不仅仅是为了构建我的模块版本,所以它只是读取传入的数据,然后以MySQL可接受的格式重写它,对吗?这是防止SQL注入的最佳方法吗?是的,并且还可以转义所有的
SQL
——重要的语法,如结束引号(
)、注释(
--
*/
)等。@Stecco可以准备语句(取决于它们的实现方式)更安全,因为查询和值的组合步骤由SQL server完成,而不是由第三方库完成。(假设SQL server是最新的,并且维护良好)@t.niese是正确的。@Stecco准备的语句是模块TODO的基石。