(1).CAST()函數的參數是一個表達式,它包括用AS關鍵字分隔的源值和目標數據類型。以下例子用於將文本字符串'12'轉換為整型:
SELECT CAST('12' AS int)
(2).返回值是整型值12。如果試圖將一個代表小數的字符串轉換為整型值,又會出現什么情況呢?
SELECT CAST('12.5' AS int)
(3).CAST()函數和CONVERT()函數都不能執行四舍五入或截斷操作。由於12.5不能用int數據類型來表示,所以對這個函數調用將產生一個錯誤:
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value
'12.5' to a column of data type int.
(4). 要返回一個合法的數值,就必須使用能處理這個值的數據類型。對於這個例子,存在多個可用的數據類型。如果通過CAST()函數將這個值轉換為 decimal類型,需要首先定義decimal值的精度與小數位數。在本例中,精度與小數位數分別為9 與2。精度是總的數字位數,包括小數點左邊和右邊位數的總和。而小數位數是小數點右邊的位數。這表示本例能夠支持的最大的整數值是9999999,而最小 的小數是0.01。
SELECT CAST('12.5' AS decimal(9,2))
decimal數據類型在結果網格中將顯示有效小數位: 12.50
(5).精度和小數位數的默認值分別是18與0。如果在decimal類型中不提供這兩個值,SQL Server將截斷數字的小數部分,而不會產生錯誤。
SELECT CAST('12.5' AS decimal)
結果是一個整數值:12
(6).在表的數據中轉換數據類型是很簡單的。下面的例子使用Product表,首先執行如下查詢:
SELECT ProductNumber, ProductLine, ProductModelID
FROM Production.Product
ProductSubCategoryID < 4
(7). 假定產品經理已經創建了一個系統,用於唯一地標識生產出來的每輛自行車,以便跟蹤其型號、類型和類別。他決定合並產品號、產品生產線標識符、產品型號標識 符和一個順序號,為生產出來的每輛自行車創建一個唯一的序列號。在這個過程的第一步,他要求提供包括除順序號之外的所有屬性的所有可能產品的根標識符。
如果使用下面的表達式,就不能得到希望的結果,如圖6-2所示。
1.SELECT ProductNumber
2.+ '-'
3.+ ProductLine
4.+ '-'
5.+ ProductModelID AS BikeSerialNum
6.FROM Production.Product
7.WHERE ProductSubCategoryID < 4
我 們沒有得到希望的結果,而得到了有點奇怪的錯誤消息:請把nvarchar值轉換為 int。因為之前我們沒有要求進行任何轉換,所以這個錯誤很奇怪。這個查詢的問題在於我們試圖利用第一個連接符來連接字符值ProductNumber, 利用第二個連接符連接另一個字符值ProductLine,最后連接的是ProductModelID字符值(它是一個整數)。
查詢引擎會把連接符當成一個數學運算符,而不是一個字符。不管結果是什么,都需要更正這個表達式,以確保使用正確的數據類型。以下表達式執行了必要的類型轉換,返回如圖6-3所示的結果:
SELECT ProductNumber
+ '-'
+ ProductLine
+ '-'
+ CAST(ProductModelID AS char(4)) AS BikeSerialNum
FROM Production.Product
WHERE ProductSubCategoryID < 4
如果把整型值轉換為字符類型就不會增加多余的空格了。查詢引擎將把這些值用加號和連接符組合在一起,進行字符串連接運算,而不是和前面的數值進行加法或者減法運算了。
-------------------------------------------
MySQL 的CAST()和CONVERT()函數可用來獲取一個類型的值,並產生另一個類型的值。兩者具體的語法如下:
1 |
CAST (value as type); |
2 |
CONVERT (value, type); |
就是CAST(xxx AS 類型), CONVERT(xxx,類型)。
可以轉換的類型是有限制的。這個類型可以是以下值其中的一個:
- 二進制,同帶binary前綴的效果 : BINARY
- 字符型,可帶參數 : CHAR()
- 日期 : DATE
- 時間: TIME
- 日期時間型 : DATETIME
- 浮點數 : DECIMAL
- 整數 : SIGNED
- 無符號整數 : UNSIGNED
下面舉幾個例子:
例一
1 |
mysql> SELECT CONVERT ( '23' ,SIGNED); |
2 |
+ ----------------------+ |
3 |
| CONVERT ( '23' ,SIGNED) | |
4 |
+ ----------------------+ |
5 |
| 23 | |
6 |
+ ----------------------+ |
7 |
1 row in set |
例二
1 |
mysql> SELECT CAST ( '125e342.83' AS signed); |
2 |
+ ------------------------------+ |
3 |
| CAST ( '125e342.83' AS signed) | |
4 |
+ ------------------------------+ |
5 |
| 125 | |
6 |
+ ------------------------------+ |
7 |
1 row in set |
例三
1 |
mysql> SELECT CAST ( '3.35' AS signed); |
2 |
+ ------------------------+ |
3 |
| CAST ( '3.35' AS signed) | |
4 |
+ ------------------------+ |
5 |
| 3 | |
6 |
+ ------------------------+ |
7 |
1 row in set |
像上面例子一樣,將varchar 轉為int 用 cast(a as signed),其中a為varchar類型的字符串。
例4
在SQL Server中,下面的代碼演示了datetime變量中,僅包含單純的日期和單純的時間時,日期存儲的十六進制存儲表示結果。
01 |
DECLARE @dt datetime |
02 |
|
03 |
--單純的日期 |
04 |
SET @dt= '1900-1-2' |
05 |
SELECT CAST(@dt as binary(8)) |
06 |
--結果: 0x0000000100000000 |
07 |
|
08 |
--單純的時間 |
09 |
SET @dt= '00:00:01' |
10 |
SELECT CAST(@dt as binary(8)) |
11 |
--結果: 0x000000000000012C |
MySQL的類型轉換和SQL Server一樣,就是類型參數有點點不同:CAST(xxx AS 類型) , CONVERT(xxx,類型)。