如何在 Azure 表查询中转义字符?

Posted

技术标签:

【中文标题】如何在 Azure 表查询中转义字符?【英文标题】:How to escape characters in Azure Table queries? 【发布时间】:2020-01-08 21:27:58 【问题描述】:

我想查询以 message 开头的列的行:metric="foo"

我尝试使用百分比和十六进制代码对=" 进行编码,但没有成功。

Microsoft 文档说必须对特殊字符进行编码,但没有说明如何编码:https://docs.microsoft.com/en-us/rest/api/storageservices/querying-tables-and-entities#query-string-encoding

当被比较的值包含特殊字符时,查询应该是什么样子?

【问题讨论】:

您是否使用 sdk 进行查询? 是否要使用参数“metric”来过滤结果 我在 C# 中使用 Azure SDK。 @IgorGatis,如果您使用的是 azure sdk,那么 sdk 已经为您解决了难题,您可以在下面看到我的答案。如果不是这样,请向我们展示您的代码以及您正在使用哪些 nuget 包。 @IgorGatis,你好,只是想看看你现在能不能解决你的问题? 【参考方案1】:

如果您使用的是 azure sdk,那么 sdk 已经为您解决了难题。

在我的测试中,我使用的是最新的 azure table storage sdk Microsoft.Azure.Cosmos.Table,版本 1.0.4。

测试代码:

    static void Main(string[] args)
    
        string connstr = "xxxx";
        var storageAccount = CloudStorageAccount.Parse(connstr);
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
        CloudTable table = tableClient.GetTableReference("myCustomer123");

        TableQuery<CustomerEntity> query = new TableQuery<CustomerEntity>();

        string myfilter = TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "ivan"),
                                  TableOperators.And,
                                  //for metric="foo", like below.                                      
                                  TableQuery.GenerateFilterCondition("PhoneNumber", QueryComparisons.Equal, "metric=\"foo\"")
                                  );

        query.FilterString = myfilter;

        var items = table.ExecuteQuery(query);

        foreach (var item in items)
        
            Console.WriteLine(item.RowKey);
            Console.WriteLine(item.PhoneNumber);
        

       Console.WriteLine("*****end******");
       Console.ReadLine();

    

测试结果:

【讨论】:

【参考方案2】:

如果要使用参数过滤结果,可以使用?$filter=&lt;your parameter&gt;%20eq%20'&lt;vaule&gt;'。例如

var date = DateTime.Now.ToUniversalTime().AddYears(1).ToString("R");
            var CanonicalizedResource = "/" + StorageAccountName + "/people";
            var StringToSign = date + "\n" + CanonicalizedResource;
            // List the containers in a storage account.
            // ListContainersAsyncREST(StorageAccountName, StorageAccountKey, CancellationToken.None).GetAwaiter().GetResult();
            var hmacsha = new HMACSHA256();
            hmacsha.Key = Convert.FromBase64String(StorageAccountKey);
         var sig=   hmacsha.ComputeHash(UTF8Encoding.UTF8.GetBytes(StringToSign));
            var sig1 = Convert.ToBase64String(sig);

            Console.WriteLine(sig1);
            String uri = "https://jimtestperfdiag516.table.core.windows.net/people" + "?$filter=PartitionKey%20eq%20'Jim'";
            HttpClient client = new HttpClient();
            var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri);


            httpRequestMessage.Headers.Add("x-ms-date", date);

            var str = "SharedKeyLite " + StorageAccountName + ":" + sig1;
            httpRequestMessage.Headers.TryAddWithoutValidation("Authorization", str);
            httpRequestMessage.Headers.Add("x-ms-version", "2017-04-17");
            httpRequestMessage.Headers.Add("Accept", "application/json;odata=fullmetadata");
            var results = client.SendAsync(httpRequestMessage).Result;
            var response = results.Content.ReadAsStringAsync().Result;
           var objs = JsonConvert.DeserializeObject(response);


            Console.WriteLine(objs);

【讨论】:

以上是关于如何在 Azure 表查询中转义字符?的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中转义字符怎么写

如何在 Hadoop 上运行的 Cloudera Impala 的 python impyla 查询中转义字符

JAVA中转义字符'\t'的含义?

微信小程序中转义字符的处理

mybatis sql语句中转义字符

ios 请求数据中转义字符&quot;的处理