[英]Restoring changes boolean true to false
在我的程序中有一種方法需要備份,如下所示:
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()
該列在mysql 5.5中被設計為bool。
恢復期間,此字段是否轉換為字符串?
如果我使用LOAD DATA INFILE而不是我的方法,可以解決此問題嗎?
這是我的恢復數據的方法(雖然有點長,但是有些人要求查看我為此做了些什么)
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;
}
}
這看起來像是在數字上下文中解釋字符串值的問題。
對於INSERT語句,有一個字符串文字'True'
將被轉換為整數。 當字符串是非數字時,MySQL不會引發異常或錯誤,MySQL會獲取任何可能的前導數字值,然后丟棄其余的值。 如果MySQL找不到數字,它將求值為0。因此,許多字符串最終都被求值為0的整數。
在數字上下文中評估字符串文字的一個簡單示例是向其添加0:
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'
在數字上下文中均等於0 。
OP狀態:
該列在mysql 5.5中被設計為bool。
目前尚不清楚這意味着什么,因為MySQL 5.5中沒有“ BOOLEAN
”列數據類型。
MySQL確實可以識別布爾值TRUE
和FALSE
,但是實際上它們只是計算結果為整數1
和0
關鍵字。
布爾文字不包含在單引號中。 用單引號引起來的值,例如'True'
和'False'
是字符串文字。
從“布爾”到MySQL數據類型有幾種可能的映射。
我們始終為布爾值保留的數據類型為TINYINT(1) UNSIGNED COMMENT 'boolean'
COMMENT'boolean TINYINT(1) UNSIGNED COMMENT 'boolean'
。
盡管也可以使用布爾型關鍵字TRUE
或FALSE
,但我們將字面值指定為1或0。 如果我們分配了字符串文字值'True'
(如MySQL允許),它將被轉換為0
,就像'False'
被轉換為0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.