今天一上班老大要求我改善我们网站系统的注册机制。之前我们是严格区分大小写的,所以会出现同一个登陆名的各种写法,比如说admin,Admin,aDmin,ADMIN等等。今天他要求我用户可以注册他想要的大小写字母,不过一旦某个用户名被注册了,它的其他形式一律被算为存在的。
因为我之前接触数据库不多,所以想了半天没想出什好方法,最后愚蠢的决定先把全部用户的用户名查询出来赋给一个数组,再把数组值一个字母一个字母的对比。不过很快放弃了这个世纪笑话,开始摸索。就这样在微软MSDN上我看到了CAST的用法。 用CAST来取数据库中的某字段lowercase值,这方法又简单又方便,恨自己没好好学。用法很简单对于我的例子具体用法如下:
$username=trim($_GET["username"]); $lUserName = strtolower($username); $conn=mysql_open(); $sql="select * from user where CAST(user_name AS char(30))='$lUserName'"; $query=mysql_query($sql); $rst=mysql_fetch_object($query); mysql_close($conn); if ($rst)echo 'true'; else echo 'false';
在第5行取用Ajax传来用户要注册的username值,再用第6行的函数转换成小写字母的值。
最后在SQL语句中使用CAST来去数据表中的值与之前的值对比就可以了,如果存在一样字母顺序组成的用户名就返回true,若不存在则反之。
再举几个例子
1, 每个示例都检索列表价格的第一位是 3 的产品的名称,并将 ListPrice 转换为 int 。
-- Use CAST USE AdventureWorks2008R2; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CAST(ListPrice AS int) LIKE '3%'; GO -- Use CONVERT. USE AdventureWorks2008R2; GO SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice FROM Production.Product WHERE CONVERT(int, ListPrice) LIKE '3%'; GO
以下示例将本年度截止到现在的全部销售额 (SalesYTD ) 除以佣金百分比 (CommissionPCT ),从而得出单列计算结果 (Computed )。在舍入到最接近的整数后,将此结果转换为 int 数据类型。
USE AdventureWorks2008R2; GO SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS 'Computed' FROM Sales.SalesPerson WHERE CommissionPCT != 0; GO
下面是结果集:
Computed ------ 379753754 346698349 257144242 176493899 281101272 0 301872549 212623750 298948202 250784119 239246890 101664220 124511336 97688107 (14 row(s) affected)
以下示例使用 CAST 连接非字符型非二进制表达式。
USE AdventureWorks2008R2; GO SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice FROM Production.Product WHERE ListPrice BETWEEN 350.00 AND 400.00; GO
下面是结果集:
ListPrice ------------------ The list price is 357.06 The list price is 364.09 The list price is 364.09 The list price is 364.09 The list price is 364.09 (5 row(s) affected)
以下示例将 money 列 SalesYTD 转换为 int 列,然后再转换为 char(20) 列,以便可以将其用于 LIKE 子句。USE AdventureWorks2008R2; GO SELECT p.FirstName, p.LastName, s.SalesYTD, s.BusinessEntityID FROM Person.Person p JOIN Sales.SalesPerson s ON p.BusinessEntityID = s.BusinessEntityID WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%'; GO
下面是结果集:
FirstName LastName SalesYTD SalesPersonID ---------------- ------------------- ---------------- ------------- Tsvi Reiter 2811012.7151 279 Syed Abbas 219088.8836 288 Rachel Valdez 2241204.0424 289 (3 row(s) affected)