轉:sql cast和convert用法詳解

來源:互聯網
上載者:User

標籤:

原文:http://www.2cto.com/database/201310/250880.html

sql cast和convert用法詳解 總結:以下這條僅僅適用於mysqlSELECT {fn CONCAT(CONVERT(user_id,CHAR),USER_NAME)} AS str FROM t_sys_user以下這條僅僅適用於sqlserver2008SELECT {fn CONCAT(CONVERT(CHAR,user_id),USER_NAME)} AS str FROM t_sys_user以下這條sqlserver和mysql相容SELECT {fn CONCAT(CAST(user_id AS CHAR),USER_NAME)} AS str FROM t_sys_user 注釋:cast是類型轉換函式,sqlserver和mysql通用。            convert也是類型轉換,在sqlserver2008和mysql中均存在,但是參數順序相反。            concat函數在sqlserver2008和mysql中均有,但是在sqlserver2008中需要這樣適用{fn concat(arg0,arg1,.....)}且不適用與int類型和varchar類型串連。sqlserver2008中字串串連一般用“+”號。不過在sqlserver2012中好像支援直接使用concat函數。 mysql可以轉換成的類型限制:就是CAST(xxx AS 類型), CONVERT(xxx,類型)。可以轉換的類型是有限制的。這個類型可以是以下值其中的一個:二進位,同帶binary首碼的效果 : BINARY    字元型,可帶參數 : CHAR()     日期 : DATE     時間: TIME     日期時間型 : DATETIME     浮點數 : DECIMAL      整數 : SIGNED     不帶正負號的整數 : UNSIGNED  以下部分為轉載 以上部分為自己總結。 sqlserver將某種資料類型的運算式顯式轉換為另一種資料類型。CAST 和 CONVERT 提供相似的功能。文法使用 CAST:CAST ( expression AS data_type )使用 CONVERT:CONVERT (data_type[(length)], expression [, style])參數expression是任何有效 Microsoft® SQL Server™ 運算式。有關更多資訊,請參見運算式。data_type目標系統所提供的資料類型,包括 bigint 和 sql_variant。不能使用使用者定義的資料類型。有關可用的資料類型的更多資訊,請參見資料類型。lengthnchar、nvarchar、char、varchar、binary 或 varbinary 資料類型的選擇性參數。style日期格式樣式,藉以將 datetime 或 smalldatetime 資料轉換為字元資料(nchar、nvarchar、char、varchar、nchar 或 nvarchar 資料類型);或者字串格式樣式,藉以將 float、real、money 或 smallmoney 資料轉換為字元資料(nchar、nvarchar、char、varchar、nchar 或 nvarchar 資料類型)。SQL Server 支援使用科威特演算法的阿拉伯樣式中的資料格式。在表中,左側的兩列表示將 datetime 或 smalldatetime 轉換為字元資料的 style 值。給 style 值加 100,可獲得包括世紀數位的四位年份 (yyyy)。不帶世紀數位 (yy) 帶世紀數位 (yyyy) 標準 輸入/輸出** - 0 或 100 (*)  預設值 mon dd yyyy hh:miAM(或 PM) 1 101 美國 mm/dd/yyyy 2 102 ANSI yy.mm.dd 3 103 英國/法國 dd/mm/yy 4 104 德國 dd.mm.yy 5 105 意大利 dd-mm-yy 6 106 - dd mon yy 7 107 - mon dd, yy 8 108 - hh:mm:ss - 9 或 109 (*)  預設值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM) 10 110 美國 mm-dd-yy 11 111 日本 yy/mm/dd 12 112 ISO yymmdd - 13 或 113 (*)  歐洲預設值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h) 14 114 - hh:mi:ss:mmm(24h) - 20 或 120 (*)  ODBC 規範 yyyy-mm-dd hh:mm:ss[.fff] - 21 或 121 (*)  ODBC 規範(帶毫秒) yyyy-mm-dd hh:mm:ss[.fff] - 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格) - 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM - 131* 科威特  預設值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始終返回世紀數位 (yyyy)。** 當轉換為 datetime 時輸入;當轉換為字元資料時輸出。*** 專門用於 XML。對於從 datetime 或 smalldatetime 到 character 資料的轉換,輸出格式如表中所示。對於從 float、money 或 smallmoney 到 character 資料的轉換,輸出等同於 style 2。對於從 real 到 character 資料的轉換,輸出等同於 style 1。 重要  預設情況下,SQL Server 根據截止年份 2049 解釋兩位元字的年份。即,兩位元字的年份 49 被解釋為 2049,而兩位元字的年份 50 被解釋為 1950。許多用戶端應用程式(例如那些基於 OLE Automation 物件的用戶端應用程式)都使用 2030 作為截止年份。SQL Server 提供一個配置選項("兩位元字的截止年份"),藉以更改 SQL Server 所使用的截止年份並對日期進行一致性處理。然而最安全的辦法是指定四位元字年份。 當從 smalldatetime 轉換為字元資料時,包含秒或毫秒的樣式將在這些位置上顯示零。當從 datetime 或 smalldatetime 值進行轉換時,可以通過使用適當的 char 或 varchar 資料類型長度來截斷不需要的日期部分。下表顯示了從 float 或 real 轉換為字元資料時的 style 值。值 輸出 0(預設值) 最大為 6 位元。根據需要使用科學記號標記法。 1 始終為 8 位值。始終使用科學記號標記法。 2 始終為 16 位值。始終使用科學記號標記法。 在下表中,左列表示從 money 或 smallmoney 轉換為字元資料時的 style 值。值 輸出 0(預設值) 小數點左側每三位元字之間不以逗號分隔,小數點右側取兩位元,例如 4235.98。 1 小數點左側每三位元字之間以逗號分隔,小數點右側取兩位元,例如 3,510.92。 2 小數點左側每三位元字之間不以逗號分隔,小數點右側取四位元,例如 4235.9819。  傳回型別返回與 data type 0 相同的值。注釋隱性轉換指那些沒有指定 CAST 或 CONVERT 函數的轉換。而顯式轉換指那些已指定了所需 CAST (CONVERT) 函數的轉換。下面的圖表顯示了所有可用於 SQL Server 系統提供的資料類型的顯式和隱性轉換,這些資料類型包括 bigint 和 sql_variant。  說明  因為 Unicode 資料始終使用偶數位位元組,所以當在 binary 或 varbinary 資料類型與 Unicode 所支援的資料類型之間進行轉換時會使用提示。例如,此轉換不返回 41 的十六進位值,而是返回 4100 的十六進位值:SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary) 不支援 text 和 image 資料類型的自動資料類型轉換。可以將 text 資料顯式轉換為字元資料,將 image 資料顯性轉換為 binary 或 varbinary 資料,但是最大長度為 8000。如果嘗試進行不正確的轉換(例如,將包含字母的字元運算式轉換為 int),則 SQL Server 會產生錯誤資訊。當 CAST 或 CONVERT 的輸出是字串並且輸入也是字串時,輸出與輸入具有相同的定序和定序標籤。如果輸入不是字串,則輸出採用資料庫的預設定序及強制預設的定序標籤。有關更多資訊,請參見定序的優先順序。若要給輸出指派不同的定序,請將 COLLATE 子句應用到 CAST 或 CONVERT 函數的結果運算式中。例如:SELECT CAST(‘‘abc‘‘ AS varchar(5)) COLLATE French_CS_AS不存在有關賦值的從 sql_variant 資料類型進行的隱性轉換,但是存在轉換為 sql_variant 的隱性轉換。將字元或二進位運算式(char、nchar、nvarchar、varchar、binary 或 varbinary)轉換為不同資料類型的運算式時,資料可能會被截斷,只顯示一部分,或者因為結果太短無法顯示而返回錯誤。除下表中所顯示的轉換外,轉換為 char、varchar、nchar、nvarchar、binary 和 varbinary 時將被截斷。 varchar *   nchar E   nvarchar E money、smallmoney、numeric、decimal、float 或 real char E   varchar E   nchar E   nvarchar E * 結果長度太短而無法顯示。E 因為結果長度太短無法顯示而返回錯誤。Microsoft SQL Server 僅保證往返轉換(即,從未經處理資料類型進行轉換後又返回未經處理資料類型)在各版本間產生相同值。下面的樣本顯示往返轉換:DECLARE @myval decimal (5, 2)SET @myval = 193.57SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))-- Or, using CONVERTSELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))例如,不要嘗試構造 binary 值並將它們轉換為數字資料類型分類的資料類型。SQL Server 並不保證 decimal 或 numeric 資料類型轉換為 binary 的結果在 SQL Server 各版本間相同。下面的樣本顯示了由於太短而無法顯示的結果運算式。USE pubsSELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2))FROM titlesWHERE type = ‘‘trad_cook‘‘下面是結果集:Title                        ------------------------- -- Onions, Leeks, and Garlic *  Fifty Years in Buckingham *  Sushi, Anyone?            *  (3 row(s) affected)當具有不同小數位元的資料類型進行轉換時,值將被截斷為最精確的數位。例如,SELECT CAST(10.6496 AS int) 的結果為 10。轉換時,若目標資料類型的小數位元小於來源資料類型的小數位元,則要轉換的值將被四捨五入。例如,CAST(10.3496847 AS money) 的結果是 $10.3497。當將非數字類型的 char、nchar、varchar 或 nvarchar 資料轉換為 int、float、numeric 或 decimal 時,SQL Server 將返回錯誤資訊。當將Null 字元串 (" ") 轉換為 numeric 或 decimal 時,SQL Server 也將返回錯誤資訊。使用二進位字串資料當 binary 或 varbinary 資料轉換為字元資料並且在 x 後面指定了奇數位的值時,SQL Server 在 x 後面添加 0(零)以成為偶數位值。位元據包含從 0 到 9 和從 A 到 F(或從 a 到 f)的字元,每兩個字元為一組。二進位字串必須以 0x 開頭。例如,若要輸入 FF,請鍵入 0xFF。最大值是一個 8000 位元組的二進位值,每個位元組的最大值都是 FF。Binary 資料類型不能用於十六進位資料,而是用於位元模式。對於儲存為位元據的十六進位數位轉換和計算結果,無法保證其準確性。當指定 binary 資料類型的長度時,每兩個字元被算作是一個單位長度。長度 10 表示將輸入 10 個雙字元組。由 0x 表示的空二進位字串可以儲存為位元據。樣本A. 同時使用 CAST 和 CONVERT每個樣本都將檢索書名(這些圖書的截止當前銷售額的第一位元字為 3),並將這些圖書的 ytd_sales 轉換為 char(20)。-- Use CAST.USE pubsGOSELECT SUBSTRING(title, 1, 30) AS Title, ytd_salesFROM titlesWHERE CAST(ytd_sales AS char(20)) LIKE ‘‘3%‘‘GO-- Use CONVERT.USE pubsGOSELECT SUBSTRING(title, 1, 30) AS Title, ytd_salesFROM titlesWHERE CONVERT(char(20), ytd_sales) LIKE ‘‘3%‘‘GO下面是任一查詢的結果集:Title                          ytd_sales   ------------------------------ ----------- Cooking with Computers: Surrep 3876        Computer Phobic AND Non-Phobic 375         Emotional Security: A New Algo 3336        Onions, Leeks, and Garlic: Coo 375         (4 row(s) affected)B. 使用帶有算術運算子的 CAST下面的樣本通過將總的截止當前銷售額 (ytd_sales) 與每本圖書的價格 (price) 相除,進行單獨列計算 (Copies)。在四捨五入到最接近的整數後,此結果將轉換為 int 資料類型。USE pubsGOSELECT CAST(ROUND(ytd_sales/price, 0) AS int) AS ‘‘Copies‘‘FROM titlesGO下面是結果集:Copies      ------ 205         324         6262        205         102         7440        NULL        383         205         NULL        17          187         16          204         418         18          1263        273         (18 row(s) affected)C. 使用 CAST 進行串聯下面的樣本使用 CAST 資料類型轉換函式來串聯非字元、非二進位運算式。USE pubsGOSELECT ‘‘The price is ‘‘ + CAST(price AS varchar(12))FROM titlesWHERE price > 10.00GO下面是結果集:------------------ The price is 19.99        The price is 11.95        The price is 19.99        The price is 19.99        The price is 22.95        The price is 20.00        The price is 21.59        The price is 10.95        The price is 19.99        The price is 20.95        The price is 11.95        The price is 14.99        (12 row(s) affected)D. 使用 CAST 獲得更多易讀文本下面的樣本在挑選清單中使用 CAST 將 title 列轉換為 char(50) 列,這樣結果將更加易讀。USE pubsGOSELECT CAST(title AS char(50)), ytd_salesFROM titlesWHERE type = ‘‘trad_cook‘‘GO下面是結果集:                                                       ytd_sales--------------------------------------------------     ---------Onions, Leeks, and Garlic: Cooking Secrets of the      375Fifty Years in Buckingham Palace Kitchens              15096Sushi, Anyone?                                         4095(3 row(s) affected)E. 使用帶有 LIKE 子句的 CAST下面的樣本將 int 列(ytd_sales 列)轉換為 char(20) 列,以便使用 LIKE 子句。USE pubsGOSELECT title,-ytd_salesFROM titlesWHERE CAST(ytd_sales AS char(20)) LIKE ‘‘15%‘‘ AND type = ‘‘trad_cook‘‘GO 下面是結果集:title    ytd_sales   ------------------------------------------------------------ Mysql: 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> SELECTCONVERT(‘23‘,SIGNED);2 +----------------------+3 | CONVERT(‘23‘,SIGNED) |4 +----------------------+5 |                   23 |6 +----------------------+7 1 row inset例二1 mysql> SELECTCAST(‘125e342.83‘ASsigned);2 +------------------------------+3 | CAST(‘125e342.83‘ASsigned) |4 +------------------------------+5 |                          125 |6 +------------------------------+7 1 row inset例三1 mysql> SELECTCAST(‘3.35‘ASsigned);2 +------------------------+3 | CAST(‘3.35‘ASsigned) |4 +------------------------+5 |                      3 |6 +------------------------+7 1 row inset像上面例子一樣,將varchar 轉為int 用 cast(a as signed),其中a為varchar類型的字串。例4在SQL Server中,下面的代碼示範了datetime變數中,僅包含單純的日期和單純的時間時,日期儲存的十六進位儲存表示結果。01 DECLARE @dt datetime0203 --單純的日期04 SET @dt=‘1900-1-2‘05 SELECT CAST(@dt asbinary(8))06 --結果: 0x00000001000000000708 --單純的時間09 SET @dt=‘00:00:01‘10 SELECT CAST(@dt asbinary(8))11 --結果: 0x000000000000012CMySQL的類型轉換和SQL Server一樣,就是型別參數有點點不同:CAST(xxx AS 類型) , CONVERT(xxx,類型)。

轉:sql cast和convert用法詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.