字符串数据类型
string 数据类型表示零个或多个 Unicode 字符的序列。
- 在内部,字符串以 UTF-8编码。 无效 (non-UTF8) 字符在采集时替换为 U + FFFD Unicode 替换字符。
- KQL 没有等同于单个字符的数据类型。 单个字符表示为长度为 1 的字符串。
- 虽然
string数据类型本身没有对字符串长度的预定义限制,但实际实现可自由限制各个值。 通常,字符串限制为 1MB (使用 UTF-8 编码测量)。
字符串字面值
有几种方法可以对查询文本中 string 数据类型的文字进行编码:
- 将字符串括在双引号 (
") 中:"This is a string literal. Single quote characters (') don't require escaping. Double quote characters (") are escaped by a backslash (\)." - 将字符串括在单引号 (
') 中:'Another string literal. Single quote characters (') require escaping by a backslash (\). Double quote characters (") do not require escaping.'
在上述两种表示法中,反斜杠 (\) 字符指示转义。 反斜杠用于对括起来的引号字符,制表符 (\t) ,换行符 (\n) 和自身 (\\) 进行转义。
不能将换行符 (\n) 和返回字符 (\r) 包含为字符串文字的一部分而不使用引号。 另请参阅 多行字符串文字 (multi-line string literals)。
逐字串文字-当前不受支持
还支持逐字串文字。 在此格式中,反斜杠字符 (\) 代表自身,而不是转义字符。
- 用双引号 (
") 括起:@"This is a verbatim string literal that ends with a backslash\." - 用单引号 (
') 括起:@'This is a verbatim string literal that ends with a backslash\.'
不能将换行符 (\n) 和返回字符 (\r) 包含为字符串文字的一部分而不使用引号。 另请参阅 多行字符串文字 (multi-line string literals)。
拼接字符串文字-当前不受支持
如果两个或多个字符串字面值之间没有任何关系,那么将自动连接以在查询中形成新的字符串字面值,或者仅用空格和注释分隔这些字符串字面值。
例如,以下表达式都生成长度为 13 的字符串:
print strlen("Hello"', '@"world!"); // Nothing between them
print strlen("Hello" ', ' @"world!"); // Separated by whitespace only
print strlen("Hello"
// Comment
', '@"world!"); // Separated by whitespace and a comment
多行字符串字面值-当前不受支持
多行字符串字面值是换行符 (\n) 和返回 (\r) 字符不需要转义的字符串字面值。
- 多行字符串字面值始终出现在 "triple-backtick 弦" (` ` `) 的两次出现之间。
- 多行字符串字面值不支持转义字符。 与 verbatim 字符串字面值类似,多行字符串字面值允许换行符和返回字符。
- 多行字符串字面值不支持模糊处理。
示例
// Simple string notation
print s1 = 'some string', s2 = "some other string"
// Strings that include single or double-quotes can be defined as follows
print s1 = 'string with " (double quotes)',
s2 = "string with ' (single quotes)"
// Strings with '\' can be prefixed with '@' (as in c#)
print myPath1 = @'C:\Folder\filename.txt'
// Escaping using '\' notation
print s = '\\n.*(>|\'|=|\")[a-zA-Z0-9/+]{86}=='
// Encode a C# program in a Kusto multi-line string
print program=```
public class Program {
public static void Main() {
System.Console.WriteLine("Hello!");
}
}```
可以看到,当用双引号 (") 括起字符串时,单引号 (') 字符不需要转义,也不需要转义。 此方法使根据上下文对字符串进行引号变得更容易。
模糊处理的字符串字面值-当前不受支持
系统会跟踪查询并将其存储以进行遥测和分析。 例如,查询文本可能可供集群所有者使用。 如果查询文本包含密码之类的秘密信息,那么可能会泄露应保持为私有的信息。 为了防止发生此类泄漏,查询作者可以将特定字符串字面值标记为 模糊化字符串字面值。 查询文本中的此类字面值将自动替换为多个星型 (*) 字符,因此这些字面值不可用于后续分析。
注意
将包含私钥信息的所有字符串字面值标记为模糊字符串字面值。
模糊化字符串字面值可以通过采用 "常规" 字符串字面值并在其前面添加 h 或 H 字符来构成。
例如:
h'hello'
h@'world'
h"hello"
在许多情况下,只有字符串文字的一部分是秘密的。 在这些情况下,将文字拆分为非秘密部分和秘密部分。 然后,仅将秘密部分标记为模糊。
例如:
print x="https://contoso.blob.core.windows.net/container/blob.txt?"
h'sv=2012-02-12&se=2013-04-13T0...'