SQL Server 中大小寫區分的處理

默認情況下,SQL Server 裏面是不區分大小寫的:

E:\>sqlcmd -S "localhost\SQLEXPRESS"
1> use test
2> go
已將數據庫上下文更改爲 'Test'。

-- 建立一個 tab 的測試表, 表名稱爲全部小寫
1> CREATE TABLE [tab] ( id int )
2> go


1> select * from tab
2> go
id
-----------

(0 行受影響)
1> select * from Tab
2> go
id
-----------

(0 行受影響)

上面可以看出,默認情況下,
select * from tab 與 select * from Tab 是一樣的。
因爲不區分大小寫


下面設置  test 數據庫,讓其區分大小寫
alter database test  COLLATE  Chinese_PRC_CS_AS


1> alter database test  COLLATE  Chinese_PRC_CS_AS
2> go

1> select * from tab
2> go
id
-----------

(0 行受影響)
1> select * from Tab
2> go
消息 208,級別 16,狀態 1,服務器 WANGZHIQING\SQLEXPRESS,第 1 行
對象名 'Tab' 無效。


設置數據庫區分大小寫以後,可以看到
select * from Tab 的時候, SQL Server 無法識別 "Tab" 這個表了
因爲區分大小寫了。


下面恢復 test 數據庫的設置,讓其不區分大小寫
alter database test COLLATE Chinese_PRC_CI_AS

1> alter database test COLLATE Chinese_PRC_CI_AS
2> go


1> select * from tab
2> go
id
-----------

(0 行受影響)
1> select * from Tab
2> go
id
-----------

(0 行受影響)

恩,一切又恢復正常了。

 

上面是 關於 SQL 語句的區分大小寫


----------
--分割線--
----------


下面是 關於 數據內容的區分大小寫
首先刪除前面的測試表

1> drop table [tab]
2> go

重建一個,因爲前面的表,只有個 int 字段,沒法測大小寫。
CREATE TABLE [tab] (
  id  INT  IDENTITY(1,1),
  val NVARCHAR(10)
);
go

INSERT INTO [tab]
  SELECT 'ABC123' UNION ALL
  SELECT 'abc234' UNION ALL
  SELECT 'Abc345' UNION ALL
  SELECT 'aBC456' UNION ALL
  SELECT 'aBc567'
go

 

1> SELECT
2>   *
3> FROM
4>   tab
5> WHERE
6>  val LIKE 'a%'
7> go
id          val
----------- ----------
          1 ABC123
          2 abc234
          3 Abc345
          4 aBC456
          5 aBc567

(5 行受影響)

從上面的結果,可以看出,默認情況下,對於查詢的數據,也是不區分大小寫的
LIKE 'a%' 意味着 a 開頭 與 A 開頭的。
都會被檢索出來。


1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%' COLLATE  Chinese_PRC_CS_AS
7> go
id          val
----------- ----------
          2 abc234
          4 aBC456
          5 aBc567

(3 行受影響)

從上面的結果,可以看出,當指定了 COLLATE  Chinese_PRC_CS_AS 之後
LIKE 'a%' 將只返回小寫字母 a 開頭的數據。 大寫字母 A 開頭的,將不被檢索出來。

 

1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%' COLLATE  Chinese_PRC_CS_AS
7>  AND val LIKE '%B%'
8> go
id          val
----------- ----------
          2 abc234
          4 aBC456
          5 aBc567

(3 行受影響)

上面的查詢,爲檢索 小寫字母 a 開頭的, 中間包含字母 B 或者 b 的 (因爲這裏的 val LIKE '%B%' 沒有區分大小寫 )

1>
2> SELECT
3>   *
4> FROM
5>   Tab
6> WHERE
7>  val LIKE 'a%'COLLATE  Chinese_PRC_CS_AS
8>  AND val LIKE '%B%' COLLATE  Chinese_PRC_CS_AS
9> go
id          val
----------- ----------
          4 aBC456
          5 aBc567

(2 行受影響)

上面的查詢,爲檢索 小寫字母 a 開頭的, 中間包含字母 B 的 (因爲這裏的 val LIKE '%B%' 區分大小寫 )


下面再設置  test 數據庫,讓其區分大小寫
alter database test  COLLATE  Chinese_PRC_CS_AS


1> alter database test  COLLATE  Chinese_PRC_CS_AS
2> go

1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%'
7> go
消息 208,級別 16,狀態 1,服務器 ZQWANG-RD\SQLEXPRESS,第 1 行
對象名 'Tab' 無效。

1> SELECT
2>   *
3> FROM
4>   tab
5> WHERE
6>  val LIKE 'a%'
7> go
id          val
----------- ----------
          1 ABC123
          2 abc234
          3 Abc345
          4 aBC456
          5 aBc567

(5 行受影響)

由上面的結果可以看到
alter database test  COLLATE  Chinese_PRC_CS_AS
這樣的語句,只是設置 SQL 語句裏面,對 表名/字段名 區分大小寫
對查詢數據的時候,LIKE 'a%' 的時候, 還是默認不區分大小寫的。


下面恢復 test 數據庫的設置,讓其不區分大小寫
alter database test COLLATE Chinese_PRC_CI_AS

1> alter database test COLLATE Chinese_PRC_CI_AS
2> go

 

 

每次寫SQL, 如果需要區分大小寫的話,都加 COLLATE  Chinese_PRC_CS_AS 也是一件麻煩的事情。
假如我希望讓 Tab 的 val 字段,強制區分大小寫的話。

ALTER TABLE tab
   ALTER COLUMN  val NVARCHAR(10) COLLATE Chinese_PRC_CS_AS
go


1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%'
7> go
id          val
----------- ----------
          2 abc234
          4 aBC456
          5 aBc567

(3 行受影響)


1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%'
7>  AND val LIKE '%B%'
8> go
id          val
----------- ----------
          4 aBC456
          5 aBc567

(2 行受影響)

由上面的結果可以看到
執行了
ALTER TABLE tab
  ALTER COLUMN  val NVARCHAR(10) COLLATE Chinese_PRC_CS_AS
之後。

所有對 tab 表的 val 字段的查詢操作。
都自動強制區分大小寫了。


恢復 tab 表的 val 字段,不區分大小寫
ALTER TABLE tab
  ALTER COLUMN  val NVARCHAR(10) COLLATE Chinese_PRC_CI_AS

1> ALTER TABLE tab
2>   ALTER COLUMN  val NVARCHAR(10)(10) COLLATE Chinese_PRC_CI_AS
3> go


1> SELECT
2>   *
3> FROM
4>   Tab
5> WHERE
6>  val LIKE 'a%'
7> go
id          val
----------- ----------
          1 ABC123
          2 abc234
          3 Abc345
          4 aBC456
          5 aBc567

(5 行受影響)


好,一切又恢復到默認情況下了。


----------
--分割線--
----------

處理好了 LIKE 的大小寫
現在做做排序。

INSERT INTO [tab]
  SELECT '123ABC' UNION ALL
  SELECT '234abc' UNION ALL
  SELECT '345Abc' UNION ALL
  SELECT '456aBC' UNION ALL
  SELECT '567aBc'
go

 

1> SELECT
2>   *
3> FROM
4>   Tab
5> ORDER BY
6>   val
7> go
id          val
----------- ----------
          6 123ABC
          7 234abc
          8 345Abc
          9 456aBC
         10 567aBc
          1 ABC123
          2 abc234
          3 Abc345
          4 aBC456
          5 aBc567

(10 行受影響)

默認排序,也是不區分大小寫的。


在查詢 SQL SERVER 支持的排序規則。

SELECT
  *
FROM
  ::fn_helpcollations()
WHERE
  name LIKE 'Chinese_PRC%'

 

1> SELECT
2>   *
3> FROM
4>   Tab
5> ORDER BY
6>   val COLLATE Chinese_PRC_BIN
7> go
id          val
----------- ----------
          6 123ABC
          7 234abc
          8 345Abc
          9 456aBC
         10 567aBc
          1 ABC123
          3 Abc345
          4 aBC456
          5 aBc567
          2 abc234

(10 行受影響)


注:
ORDER BY val COLLATE Chinese_PRC_CS_AS 好像沒有效果。
因此使用 Chinese_PRC_BIN 二進制排序


----------
--分割線--
----------

前面只有英文排序
現在處理中文排序

首先清空數據。

TRUNCATE TABLE Tab
go

INSERT INTO tab
  SELECT '一' UNION ALL
  SELECT '二' UNION ALL
  SELECT '三' UNION ALL
  SELECT '四' UNION ALL
  SELECT '五'
go


在查詢 SQL SERVER 支持的排序規則。

SELECT
  *
FROM
  ::fn_helpcollations()
WHERE
  name LIKE 'Chinese_PRC%'

 


Chinese_PRC_CS_AS_KS_WS:
Chinese-PRC, case-sensitive, accent-sensitive, kanatype-sensitive, width-sensitive


-- 按照拼音來排序
1> SELECT
2>   *
3> FROM
4>   Tab
5> ORDER BY
6>   val COLLATE Chinese_PRC_CS_AS_KS_WS
7> go
id          val
----------- ----------
          2 二
          3 三
          4 四
          5 五
          1 一

(5 行受影響)

 

Chinese_PRC_Stroke_CI_AS_KS_WS:
Chinese-PRC-Stroke, case-insensitive, accent-sensitive, kanatype-sensitive, width-sensitive

-- 按照筆畫數的多少來排序
1> SELECT
2>   *
3> FROM
4>   Tab
5> ORDER BY
6>   val COLLATE Chinese_PRC_Stroke_CS_AS_KS_WS
7> go
id          val
----------- ----------
          1 一
          2 二
          3 三
          5 五
          4 四

(5 行受影響)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章