【问题标题】:How to escape strings in MySQL Document Store find expression?如何在 MySQL 文档存储查找表达式中转义字符串?
【发布时间】:2017-08-17 13:48:32
【问题描述】:

我正在使用 MySQL 文档存储,但不知道如何正确转义 find 语句中带有特殊字符的字符串。

Visual C# 2015 连接器/NET:8.0.8.0

var realmName = "Aman'Thul";
var realm = collection.Find("Name = :name")
    .Bind("name", realmName).Limit(1).Execute().FetchOne();

=> System.ArgumentException: Unterminated string starting at 4

问题显然是撇号,但同样的结果出现在括号、连字符等其他“特殊字符”上。

版本 #2:

var realmName = "Aman''Thul";
var realm = collection.Find("Name = :realmName").Bind("realmName", realmName).Limit(1).Execute().FetchOne();

=> System.ArgumentException: Only 1 tokens consumed, out of 3

版本 #3:

var realmName = "Aman\\'Thul";
var realm = collection.Find("Name = :realmName").Bind("realmName", realmName).Limit(1).Execute().FetchOne();

=> System.ArgumentException: Can't parse at pos: 4

在这一点上,我没有想法。正确转义这些表达式的正确方法是什么?必须有一些我似乎找不到的通用解决方案,因为有关 MySQL 文档存储的信息很少。

【问题讨论】:

  • 我只是在猜测,但是离开文档,你会用另一个撇号转义一个撇号,所以为此:my'name 你应该输入my''name。但是,不同的版本有不同的转义方法,还有你已经尝试过的\'选项(虽然只有一个斜线,而不是两个)。
  • 双撇号是我的第 2 版,不起作用。单反斜杠转义撇号会导致与版本 #1 相同的错误。
  • 这是显而易见的事情,但是您是否尝试过此页面:dev.mysql.com/doc/refman/5.6/en/… 但对于您的版本?
  • 啊!您是否尝试过:var realmName = "\"Aman'Thul\""; 因为显然,它会为您自动转义此字符串,但您可能仍需要自己将自动转义的字符串包装在字符串文字中。 (或者也许用单引号括起来,我不确定)。
  • 我确实检查了文档,但这些是针对标准 SQL 查询的,在这种情况下不起作用。

标签: c# mysql escaping nosql


【解决方案1】:

正如 cmets 中所讨论的 - 看来您需要自己将单词包装在字符串文字中,因为它不会自动执行此操作。它确实转义了该字符串的内容,因此无需出于 MySQL 的原因转义任何内容,仅出于 C# 的原因转义。像这样:

var realmName = "\"Aman'Thul\"";

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    相关资源
    最近更新 更多