如果我們直接使用max獲取varchar的最大值,很多時候我們獲取正確的值。在這之前我們要先了解CAST 和 CONVERT 轉化類型的函數,這樣我們獲取的的最大值就不是“999”。
1、使用 CAST:
CAST ( expression AS data_type )
2、使用 CONVERT:
CONVERT (data_type[(length)], expression [, style])
可以看到,convert比CAST多了bai一個style,在轉化成日期類型時,因為需要格式要求,cast就不合適了,應該還有其他一些需要轉化格式的,比如金錢等等,這個看看幫助就知道。
其他時候,二者實現的功能都一樣。 都是轉化類型的函數
3、 CAST和CONVERT比較
(1)cast一般更容易使用,convert的優點是可以格式化日期和數值;
(2)convert一般用於日期和時間值,小數之間轉換,cast一般用於小數轉數值和字符型;
(3)converk顯示轉換,cast是強制轉換;
4、mysql中獲取varchar類型數據的最大值
-- 獲取最大值 select MAX(CAST(code as SIGNED INTEGER)) from customer; select MAX(CAST(code as UNSIGNED INTEGER)) from customer ; -- 或 select max(Convert(code,SIGNED)) FROM from customer select max(Convert(code,UNSIGNED)) FROM from customer -- 也可以轉化為小數 SELECT CAST(2017 as decimal(8,2)); -- 2017.00 SELECT CONVERT(2017,decimal(8,2)); -- 2017.00
signed和unsigned用於修飾整數類型。
signed表示有符號,unsigned表示無符號。對應的有符號數的最大取值要比無符號的小約一半,因為最高一位被用來表示符號。
默認的int、short、long、long long為有符號數,也就是說,int等價於signed int,short等價於signed short,long等價於signed long,long long等價於signed long long。但是char本身是signed char還是unsigned char,取決於語言的實現(編譯器)。
范圍列表如下:
signed char:[-2^7, 2^7)即[-128, 128);
unsigned char:[0, 2^8)即[0, 256);
5、使用Thinkphp6中獲取varchar類型數據的最大值
$code = $model::fieldRaw("max(Convert(code,SIGNED))")->select()->toArray(); $code = $code[0]['max(Convert(code,SIGNED))']; //或者 $code = $model::fieldRaw("max(CAST(code as SIGNED INTEGER))")->select()->toArray(); $code = $code[0]['max(CAST(code as SIGNED INTEGER))'];
6、同理,使用orderRaw進行,也不會受varchar類型影響
$items = Customer::orderRaw("CAST(code AS UNSIGNED) desc")->select();
注意:code字段是varchar類型,如果直接使用order,不會得到正確的結果的
MySql:
SELECT * FROM customer ORDER BY CAST(code AS UNSIGNED) desc
MYSQL中FIND_IN_SET()函數的使用
這篇博客比較詳細,大家自己去看:
https://www.cnblogs.com/lixinjun8080/p/11246632.html
我叫簡單介紹一下find_in_set:
FIND_IN_SET(str,strlist)
str 要查詢的字符串
strlist 字段名 參數以”,”分隔 如 (1,2,6,8,10,22)
查詢字段(strlist)中包含(str)的結果,返回結果為null或記錄
假如字符串str在由N個子鏈組成的字符串列表strlist 中,則返回值的范圍在 1 到 N 之間。 一個字符串列表就是一個由一些被 ‘,' 符號分開的子鏈組成的字符串。如果第一個參數是一個常數字符串,而第二個是type SET列,則FIND_IN_SET() 函數被優化,使用比特計算。 如果str不在strlist 或strlist 為空字符串,則返回值為 0 。如任意一個參數為NULL,則返回值為 NULL。這個函數在第一個參數包含一個逗號(‘,')時將無法正常運行。
在thinkphp的使用:
Activity::whereRaw("FIND_IN_SET(1,participants)")->column("id");
轉成MySql:
SELECT `id` FROM `activity` WHERE ( FIND_IN_SET(1,participants) )