SQL Server 中大小寫區分的處理。sql
默認狀況下,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 行受影響)cmd
上面能夠看出,默認狀況下,
select * from tab 與 select * from Tab 是同樣的。
由於不區分大小寫it
下面設置 test 數據庫,讓其區分大小寫
alter database test COLLATE Chinese_PRC_CS_ASio
1> alter database test COLLATE Chinese_PRC_CS_AS
2> gotable
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 行受影響)