2010-09-19 92 views
0

我想知道mysql類型轉換的規則是什麼。例如MySQL類型轉換的規則

如果foo列是int,那麼select foo/2 from table似乎會產生小數。 select sum(foo) from table如果foo是浮點數,則返回sum(foo)列作爲double。如果我是一個int,select i*i from table會給出一個bigint。

使用普通運算符(如+ -/*)或聚合(如sum/avg)時,此處的類型轉換的規則是什麼?

回答

2

類型轉換的規則非常簡單。引用來自MySQL Manual :: Type Conversion in Expression Evaluation

當運算符與不同類型的操作數一起使用時,會發生類型轉換以使操作數兼容。一些轉換隱式發生。

下列規則描述如何轉換髮生用於比較操作:

  • 如果一個或兩個參數是NULL,比較的結果是NULL,除了NULL -safe <=>相等比較運算符。對於NULL <=> NULL,結果是true。不需要轉換。

  • 如果比較操作中的兩個參數都是字符串,則將它們作爲字符串進行比較。

  • 如果兩個參數都是整數,則將它們作爲整數進行比較。

  • 如果不與數字進行比較,則將十六進制值視爲二進制字符串。

  • 如果其中一個參數是TIMESTAMPDATETIME列,而另一個參數是常量,則在執行比較之前將該常量轉換爲時間戳。這樣做對ODBC更友好。請注意,對於IN()的參數沒有這樣做。爲了安全起見,在比較時總是使用完整的日期時間,日期或時間字符串。例如,要在使用日期或時間值BETWEEN時獲得最佳結果,請使用CAST()將這些值顯式轉換爲所需的數據類型。

  • 在所有其他情況下,將參數作爲浮點數(實數)進行比較。

在算術運算器的情況下,其結果是根據以下規則確定。從MySQL Manual :: Arithmetic Operators

  • 引述在-+*的情況下,結果被計算同如果兩個參數都是整數BIGINT(64位)的精度。

  • 如果其中一個參數是一個無符號整數,而另一個參數也是一個整數,則結果是一個無符號整數。

  • 如果任何的+-/*%操作數是一個真正的或字符串值,則結果的精度是具有最大精度的參數的精度。

  • 在使用/執行除法時,使用兩個精確值時的結果比例是第一個參數的比例加上div_precision_increment系統變量(默認爲4)的值。例如,表達式5.05/0.014的結果具有小數點後六位的範圍(360.714286)

然後聚集函數,以下適用。引用來自MySQL Manual :: Aggregate Functions

對於數值參數,方差和標準偏差函數返回DOUBLE值。 SUM()AVG()函數爲精確值參數(整數或DECIMAL)返回DECIMAL值,併爲近似值參數(FLOATDOUBLE)返回值DOUBLE

+0

雖然這回答了很多,但它並沒有說很多關於如1/2產生一個小數,或者我*我產生一個bigint – Anonym 2010-09-19 03:30:58

+0

@Anonym:用算術運算符的規則更新了我的答案。 – 2010-09-19 03:35:51