是否可以将sqlite中的'0'字符保存为文本

时间:2013-03-05 17:38:56

标签: sqlite system.data.sqlite

我在sqlite表中有一个带\ 0字符和文本字段的UTF字符串 当我尝试将字符串插入表文本字段然后从数据库中读取时,我注意到字符串值在\ 0字符后被截断。

问题:是否可以在sqlite中保存/恢复此类字符串,而不会在 \ 0 之后丢失数据?

代码段:

 public static void IssueWith0Character()
    {
        const string sql = "DROP TABLE IF EXISTS SomeTable;" +
                           "CREATE TABLE SomeTable (SomeField TEXT not null);"
                           + "INSERT INTO SomeTable (SomeField) Values ( :value )";

        var csb = new SQLiteConnectionStringBuilder
                      {DataSource = "stringWithNull.db", Version = 3};

        // string with '0' character
        const string stringWithNull = "beforeNull\0afterNull";

        using (var c = new SQLiteConnection(csb.ConnectionString))
        {
            c.Open();

            using (var cmd = c.CreateCommand())
            {
                var p = new SQLiteParameter(":value", DbType.String) {Value = stringWithNull};
                cmd.CommandText = sql;
                cmd.Parameters.Add(p);
                cmd.ExecuteNonQuery();
            }

            using (var cmd = c.CreateCommand())
            {
                cmd.CommandText = "SELECT SomeField FROM SomeTable;";
                var restoredValue = (string) cmd.ExecuteScalar();
                Debug.Assert(stringWithNull == restoredValue);
            }
        }
    }    

更新#1 看起来问题正处于阅读阶段。字符串中至少存在“afterNull”部分存在于数据库文件中。

UPDATE#2 这被视为System.Data.SQLite错误(< 1.04.84)。 http://system.data.sqlite.org/index.html/tktview/3567020edf12d438cb7cf757b774ff3a04dc381e

1 个答案:

答案 0 :(得分:-3)

在SQLite中,\ 0字符被视为无效。

虽然可以将这些字符串放入数据库中(使用各种函数的指针+长度形式),但是当遇到\ 0时,对字符串进行操作的许多函数都会停止。因此,documentation说:

  

涉及具有嵌入式NUL的字符串的表达式的结果未定义。

如果您确实需要使用空字节存储数据,则应将其存储为blob(DbType.Binary)。