1

我正在为 MySql 使用 OrmLite(来自 nuget),并且我保留了一些对象,这些对象将导致内容被序列化和 blobbed。我发现这些字段的架构默认为 varchar(255),它仅适用于小 blob。即使是相对较小的列表对于 255 个字符来说也太大了。

使用 OrmLite 时确保 blob 表大小正确的最佳方法是什么?

例子:

public class Foo : IHasId<long>
{
  [AutoIncrement]
  public long Id { get; set; }

  public Dictionary<string, string> TestSize { get; set; }
}

我现在采用的方法是[StringLength(6000)]为每个斑点字段进行注释。虽然这可行,但我不确定是否有更好的方法来确保足够的空间。

下面是一个完整的单元测试,说明了大小问题:

using NUnit.Framework;
using ServiceStack.DataAnnotations;
using ServiceStack.DesignPatterns.Model;
using ServiceStack.OrmLite;
using ServiceStack.OrmLite.MySql;
using System;
using System.Collections.Generic;
using System.Configuration;

namespace OrmLiteTestNamespace
{
    [TestFixture]
    public class BlobItemTest
    {
        [Test]
        public void TableFieldSizeTest()
        {
            var dbFactory = new OrmLiteConnectionFactory(
                  ConfigurationManager.AppSettings["mysqlTestConn"],
                  MySqlDialectProvider.Instance);
            using (var db = dbFactory.OpenDbConnection())
            {
                db.CreateTableIfNotExists<Foo>();
                var foo1 = new Foo()
                    {
                        TestSize = new Dictionary<string, string>()
                    };

                // fill the dictionary with 300 things
                for (var i = 0; i < 300; i++)
                {
                    foo1.TestSize.Add(i.ToString(), Guid.NewGuid().ToString());
                }
                // throws MySql exception "Data too long for column 'TestSize' at row 1"
                db.Insert(foo1);

            }
        }

    }
    public class Foo : IHasId<long>
    {
        [AutoIncrement]
        public long Id { get; set; }

        public Dictionary<string, string> TestSize { get; set; }
    } 
}
4

1 回答 1

0

Varchar数据类型是可变大小的数据类型,其空间仅由字段的内容决定,而不是由列定义的大小决定。例如,在 MySQL 中,它只占用内容的大小 + 2 个字节的长度(最多 65535 长度)。

于 2013-10-12T16:25:12.120 回答