2015-06-15 31 views
1

編寫PHP函數以確保從csv解析的數據輸入爲正確的格式(以匹配創建表時所設置的列數據類型)後,我已經瞭解到MySQL默認情況下會將所有值作爲字符串輸出。是否有任何需要確保將正確的數據類型提交給MySQL數據庫?

因此,我的問題是 - 是否需要確保一個整數(對於已設置爲存儲整數的id列)是一個整數,而不是包含數字的字符串(例如「1」)到MySQL數據庫?

如果沒有,那麼在MySQL中創建表格時,明確指出列應存儲什麼值背後的想法是什麼?

+0

出於此目的,定義「整數」。這比你想象的要難。另外,CSV文件中的所有內容都是您喜歡或不喜歡的字符串。 – tadman

+0

插入一個字符串'1'到一個int列將按預期工作。但情況並非總是如此。例如將一個字符串日期以不同於MySQL期望的格式插入到日期字段中,幾乎總是會導致嚴重結果。 mysql需要日期爲'yyyy-mm-dd'。如果你插入像'dd-yyyy-mm'這樣的東西,你最終會得到損壞的數據。 –

+0

轉義的正確方法取決於類型 –

回答

4

值正在字符串和整數之間轉換。當在MySQL中插入一行時,PHP和MySQL都可以將一個「1」字符串轉換爲一個整數1.嘗試將一個字符串「notanumber」傳遞到一個Integer字段,它不會工作,因爲您不能將該字符串值轉換爲一個號碼。 MySQL在選擇中返回字符串的原因是所有內容都是一種格式,可能還有其他原因 - 但更容易知道結果中的所有內容都是字符串,而不必檢查它是整數還是浮點數,或其他任何東西。使用PHP和隱式轉換這不是什麼大問題,但對於像C#這樣非常強大的語言來說,這可以節省大量時間。你知道這是一個字符串,並根據需要轉換爲你想要的,而不是檢查大量不同的可能性。

你絕對應該在插入前檢查數據,或者至少在沒有的情況下處理MySQL錯誤。您可以使用isset($var)來檢查空值或空值,is_numeric($var)用於整數,is_float($var)用於浮點數。我建議在將所有內容放入數據庫之前進行驗證。

1

很多數據類型將自動轉換爲MySQL中正確的類型。即將數字插入到varchar字段將成爲一個字符串。

有關說明列類型的想法有幾個原因,主要是爲了優化速度和空間。當然,你可以創建所有字段爲varchars,但將數字300000000存儲在varchar字段中需要(至少)9個字節,而對於整數字段,基本的32位(4字節)就足夠了。比較整數(在where子句中)很容易,但字符串中的數字是不同的。即訂購線貓,汽車,汽車將是:汽車,汽車,貓。但是,你將如何訂購字符串1000,1200和10000?作爲字符串,它將是1000,10000,1200。如數字1000,1200和10000.

1

對於整數/字符串,插入時數據類型不是太重要。您可能會發現一些邊界情況,即異常的浮點值字符串不能正確插入。大多數情況下,MySQL在插入時被迫做類型雜耍的時候會做正確的事情。插入到數字類型字段中的字符串將被轉換爲數字,就像MySQL所能做到的那樣。

主要問題是何時需要實際使用您插入的數據。這是數字v.s.字符串的區別變得至關重要:

mysql> create table test (strings varchar(2), integers int); 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into test values ('12', 12), ('2', 2), ('112', 112); 
Query OK, 3 rows affected (0.00 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

mysql> select * from test; 
+---------+----------+ 
| strings | integers | 
+---------+----------+ 
| 12  |  12 | 
| 2  |  2 | 
| 112  |  112 | 
+---------+----------+ 
3 rows in set (0.00 sec) 

簡單的選擇,通過整型字段排序:

mysql> select * from test order by integers; 
+---------+----------+ 
| strings | integers | 
+---------+----------+ 
| 2  |  2 | 
| 12  |  12 | 
| 112  |  112 | 
+---------+----------+ 

一切好整數排序。我們得到很好的升序列表。

但說到時間字符串:

mysql> select * from test order by strings asc; 
+---------+----------+ 
| strings | integers | 
+---------+----------+ 
| 112  |  112 | 
| 12  |  12 | 
| 2  |  2 | 
+---------+----------+ 

噢...完全錯誤的。 MySQL(正確)按字符串和字符串規則排序,112小於2

相關問題