首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将布尔值更改还原为false

将布尔值更改还原为false
EN

Stack Overflow用户
提问于 2015-01-06 15:02:23
回答 1查看 142关注 0票数 0

在我的程序中,有一种方法将备份如下:

代码语言:javascript
复制
INSERT INTO `vente` VALUES('1','101','Mehdi','Ismail','3','107','Serpina'
,'1','Ephese','3','1','0','0','2014-05-20','0615','Pacha','9','0','60','0','0',
'False','True','1','5','1',
'2014-07-02 05:14:45','1','2015-01-05 03:17:47')

还原时,True字段被存储为零

我用StreamReader读取CSV文件,并使用命令ExecutNonQuery()

该列在MySQL5.5中设计为bool。

在恢复过程中,该字段是否转换为字符串?

如果我使用LOAD数据INFILE而不是我的方法,这可以解决这个问题吗?

下面是我恢复数据的方法(它有点长,但是有些人想知道我为此做了什么)

代码语言:javascript
复制
    private void RestoreData()
    {
       // some declaration for labels and textboxes
        DirectoryInfo d = new DirectoryInfo(pathname);
        FileInfo[] Files = d.GetFiles("*.sql");
        if (Files.Length == 0)
        {
            MessageBox.Show("There is no sql files in this folder.");
            return;
        }

        for (int i = 0; i < Files.Length; ++i)
        {
            string filename = System.IO.Path.Combine(pathname, Files[i].ToString());
            TotalRows = TotalRows + File.ReadAllLines(filename).Length;
            MyArray[i] = File.ReadAllLines(filename).Length.ToString();
        }
        using (MySqlConnection conn = new MySqlConnection(PublicVariables.cs))
        {
            conn.Open();
            for (int i = 0; i < Files.Length; ++i)
            {
                string filename = System.IO.Path.Combine(pathname, Files[i].ToString());
                string tblname = Files[i].ToString();
                tblname = tblname.Substring(0, tblname.Length - 4);
                DialogResult result = MessageBox.Show("Would you restore the table " + tblname + " ?", "", MessageBoxButtons.YesNo);
                MySqlCommand cmd;
                if (result == DialogResult.Yes)
                {
                    cmd = new MySqlCommand("TRUNCATE TABLE " + tblname, conn);
                    try
                    {
                        cmd.ExecuteNonQuery();
                    }
                    catch (MySqlException e)
                    {
                        MessageBox.Show(e.Number.ToString() + " -> " + e.Message.ToString());
                        conn.Close();
                        button5.Visible = true;
                        return;
                    }
                    int RowsNbr = Convert.ToInt32(MyArray[i]);
                    System.IO.StreamReader file = new System.IO.StreamReader(filename, Encoding.UTF8, true);
                    for (int a = 0; a < RowsNbr; ++a)
                    {
                        string cmdstr = file.ReadLine();
                        cmdstr = cmdstr.Replace("\n\r", string.Empty);
                        cmd = new MySqlCommand(cmdstr, conn);
                        try
                        {
                            cmd.ExecuteNonQuery();
                        }
                        catch (MySqlException e)
                        {
                            MessageBox.Show(e.Number.ToString() + " -> " + e.Message.ToString());
                            button5.Visible = true;
                            file.Close();
                            return;
                        }
                        cmd.Dispose();
                        ++counter;
                        int barvalue = (counter * 100 / TotalRows);
                        progressBar1.Value = barvalue;
                        barproceed = true;
                    }
                }
                if (!barproceed)
                {
                    counter = counter + Convert.ToInt32(MyArray[i]);
                    int bar1value = (counter * 100) / TotalRows;
                    progressBar1.Value = bar1value;
                }
                barproceed = false;
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-06 15:33:03

这看起来像是在数值上下文中解释字符串值的问题。

在INSERT语句中,有一个字符串文本'True'正在转换为整数。当字符串是非数值时,MySQL不会抛出异常或错误,MySQL会得到它所能得到的任何前导数值,并丢弃其余的数值。如果MySQL找不到任何数值,它的计算值为0。因此,许多字符串最终被计算为整数值0。

在数值上下文中计算字符串文字的一个简单演示是向它们添加0:

代码语言:javascript
复制
SELECT d.d
     , d.d + 0
  FROM ( SELECT 'foo' AS d
          UNION ALL SELECT 'True'
          UNION ALL SELECT 'False' AS d
          UNION ALL SELECT 'a1'
          UNION ALL SELECT '123def'
          UNION ALL SELECT ' -12-345-67'
          UNION ALL SELECT '+42'
       ) d

d            d + 0  
-----------  ------
foo               0
True              0
False             0
a1                0
123def          123
 -12-345-67     -12
+42              42

我们看到字符串文本值'True''False'都在数值上下文中计算为。

“任择议定书”规定:

列在MySQL5.5.中被设计为bool

不清楚这意味着什么,因为在BOOLEAN 5.5中没有"BOOLEAN“列数据类型。

TRUEFALSE,确实可以识别布尔值,但实际上它们只是计算整数值10.的关键字。

布尔文本不包含在单引号中。以单引号括起来的值,例如'True''False',是字符串文本。

从“布尔”到MySQL数据类型有几种可能的映射。

我们总是为布尔值保留的数据是TINYINT(1) UNSIGNED COMMENT 'boolean'

我们分配文字值1或0,但也可以使用布尔关键字TRUEFALSE。如果我们分配了一个字符串文本值'True' (正如MySQL允许的那样),那么它将被转换为0,就像'False'被转换为0一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27801331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档