我想知道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)時,此處的類型轉換的規則是什麼?
我想知道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)時,此處的類型轉換的規則是什麼?
類型轉換的規則非常簡單。引用來自MySQL Manual :: Type Conversion in Expression Evaluation:
當運算符與不同類型的操作數一起使用時,會發生類型轉換以使操作數兼容。一些轉換隱式發生。
下列規則描述如何轉換髮生用於比較操作:
如果一個或兩個參數是
NULL
,比較的結果是NULL
,除了NULL
-safe<=>
相等比較運算符。對於NULL <=> NULL
,結果是true
。不需要轉換。如果比較操作中的兩個參數都是字符串,則將它們作爲字符串進行比較。
如果兩個參數都是整數,則將它們作爲整數進行比較。
如果不與數字進行比較,則將十六進制值視爲二進制字符串。
如果其中一個參數是
TIMESTAMP
或DATETIME
列,而另一個參數是常量,則在執行比較之前將該常量轉換爲時間戳。這樣做對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
值,併爲近似值參數(FLOAT
或DOUBLE
)返回值DOUBLE
。
雖然這回答了很多,但它並沒有說很多關於如1/2產生一個小數,或者我*我產生一個bigint – Anonym 2010-09-19 03:30:58
@Anonym:用算術運算符的規則更新了我的答案。 – 2010-09-19 03:35:51