首页 > 解决方案 > NVARCHAR(MAX) 可以存储多少长度?

问题描述

我有一个表格,我在其中捕获 API 返回的响应。响应是来自 API 的异常。响应本质上是一个故障异常。

响应列数据类型为 NVARCHAR(MAX)。我对响应的长度进行了查询。

SELECT Len(Request) as [Request Length], Len(Reponse) as [Response length] from SpiderDealioSvc_ErrorLog.

查询的结果是:-

Request Length  Response length
3152    212
3152    212
2953    5101
2953    5101
2953    5101

我的问题是假设响应是 20000,NVARCHAR(MAX) 会接受它还是会出现错误或问题。NVARCHAR 可以采用的最大长度是多少。

我还粘贴了响应字符串:-

{
  "Fault": {
    "faultcode": "a:DeserializationFailed",
    "faultstring": {
      "lang": "en-US",
      "TEXT": "The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:deal. The InnerException message was 'There was an error deserializing the object of type DealioCapLinkLib.Dealio.Models.Deal. The value '2.333333333E9' cannot be parsed as the type 'decimal'.'.  Please see InnerException for more details."
    },
    "detail": {
      "ExceptionDetail": {
        "HelpLink": "",
        "InnerException": {
          "HelpLink": "",
          "InnerException": {
            "HelpLink": "",
            "InnerException": {
              "HelpLink": "",
              "InnerException": "",
              "Message": "Input string was not in a correct format.",
              "StackTrace": "   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)\r\n   at System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt)\r\n   at System.Decimal.Parse(String s, NumberStyles style, IFormatProvider provider)\r\n   at System.Xml.XmlConvert.ToDecimal(String s)\r\n   at System.Xml.XmlConverter.ToDecimal(String value)",
              "Type": "System.FormatException"
            },
            "Message": "The value '2.333333333E9' cannot be parsed as the type 'decimal'.",
            "StackTrace": "   at System.Xml.XmlConverter.ToDecimal(String value)\r\n   at System.Xml.ValueHandle.ToDecimal()\r\n   at System.Xml.XmlBaseReader.ReadContentAsDecimal()\r\n   at System.Xml.XmlDictionaryReader.ReadElementContentAsDecimal()\r\n   at ReadDealFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[] )\r\n   at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)\r\n   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract)\r\n   at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)\r\n   at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver)\r\n   at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)",
            "Type": "System.Xml.XmlException"
          },
          "Message": "There was an error deserializing the object of type DealioCapLinkLib.Dealio.Models.Deal. The value '2.333333333E9' cannot be parsed as the type 'decimal'.",
          "StackTrace": "   at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)\r\n   at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo.ReadObject(XmlDictionaryReader reader, XmlObjectSerializer serializer)\r\n   at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)",
          "Type": "System.Runtime.Serialization.SerializationException"
        },
        "Message": "The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:deal. The InnerException message was 'There was an error deserializing the object of type DealioCapLinkLib.Dealio.Models.Deal. The value '2.333333333E9' cannot be parsed as the type 'decimal'.'.  Please see InnerException for more details.",
        "StackTrace": "   at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)\r\n   at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, Object[] parameters, Boolean isRequest)\r\n   at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)\r\n   at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)\r\n   at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters)\r\n   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)\r\n   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)\r\n   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)\r\n   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)\r\n   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)",
        "Type": "System.ServiceModel.Dispatcher.NetDispatcherFaultException"
      }
    }
  }
}

标签: sql-server

解决方案


一个nvarchar(MAX)可以存储多达 2GB 的字符。an 中的每个字符nvarchar大小为 2 个字节。2GB 是 2,000,000,000 字节,因此nvarchar(MAX)可以存储 2,000,000,000 / 2 个字符 = 1,000,000,000 个字符。

因此,要回答您的问题“您可以将 20,000 个字符放入一个nvarchar(MAX)吗?”:是的,您可以(50,000 次)。


推荐阅读