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

是否可以保存';0';sqlite中作为文本的字符,sqlite,system.data.sqlite,Sqlite,System.data.sqlite,我在sqlite表中有一个带有\0字符和文本字段的UTF字符串。 当我尝试将字符串插入表文本字段,然后从数据库中读取它时,我注意到字符串值在\0字符后被截断 问题:是否可以在\0之后在sqlite中保存/恢复这些字符串而不丢失数据 代码片段: public static void IssueWith0Character() { const string sql = "DROP TABLE IF EXISTS SomeTable;" +

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

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

代码片段:

 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”部分


被视为System.Data.SQLite错误的更新#2(在SQLite中,0个字符被视为无效

虽然可以将此类字符串放入数据库(使用各种函数的指针+长度形式),但许多操作字符串的函数在遇到\0时会停止。因此

包含嵌入NUL的字符串的表达式的结果未定义


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

我想这就是
BLOB
的作用。当字符串传递给sqlite时,它可能会将“\0”视为字符串终止符。您能改用“\\0”吗?谢谢,Joachim。我几乎可以肯定使用BLOB将解决持久性问题。这可能是我唯一的选择。在我的情况下,大多数时候我只有人类可读的字符串thout\0s。我很少有人可读的带\0的字符串。在引入BLOB后,有必要进行额外的ToBytes/FromBytes字符串转换,并且在我的应用程序中引入搜索功能会更加困难。Zenox,问题是为什么将\0视为保存sqlite中UTF字符串的字符串终止符。sqlite使用UTF用于存储文本。\0只是巨大UTF表中的第一个字符。我希望所有其他符号都能顺利保存。sqlite API中有sqlite3_bind_text函数,它实际上由sqlite数据适配器调用。这里提到,如果参数传递正确,请引用:[如果任何NUL字符的字节偏移量小于第四个参数的值,则结果字符串值将包含嵌入的NUL]感谢您的回复。看起来我应该在这种情况下使用BLOB/DbType.Binary。但是,我觉得奇怪的是\0在UTF中不是有效字符。我认为它只是任何UTF表中的第一个字符。在.NET字符串中也是100%有效的。因此,至少对我来说,sqlite中的默认字符串编码是UTF8,但它不是无法使用UTF8表中的一个字符(即使该字符在C字符串中用作特殊字符)。\0个字符在UTF编码的字符串中有效,SQLite允许您存储这些字符。U+0000是\0,这是一个有效的UTF-8字符。有关第二部分的详细信息,请参阅。@ryantm“包含有嵌入的Nuls的字符串的表达式的结果是不确定的。”我不完全确定这意味着什么,但我猜它是在谈论查询表达式。当我把0放入其中时,它就像查询的结尾一样对待那个字符(通常是在字符串中间的一个语法错误)。(文本或blob),它接受\0,这与您引用的前一句话一致:“如果任何NUL字符出现在字节偏移量小于第四个参数值的位置,则生成的字符串值将包含嵌入的NUL。”