在網路上搜尋相關的很多資料,總結了一下,發生這種情況的原因主要是由於定序引起的:
不指定定序的話
暫存資料表是否區分大小寫,與tempdb資料庫的排序有關.
資料庫物件是否區分大小寫,與資料庫本身的定序有關.
變數是否區分大小寫,與資料庫本身的定序有關,估計也是與tempdb資料庫有關吧.
二進位編碼:根據針對每個字元定義的位元模式來排序與比較Microsoft®SQL Server資料表中的資料。 Binary排序方式區分大小寫,亦即小寫比大寫優先,且區分腔調字。這是最快的排序方式。
若未選取此選項,SQL Server將遵循關聯之語言或字母的字典內定義的排序與比較規則。
區分大小寫指定SQL Server區分大寫與小寫字母。若未選取此選項,SQL Server會將大寫與小寫字母視為相等。若您沒有選取[區分大小寫],SQL Server並不會定義小寫字母與大寫字母的排序方式何者較高.
解決方案:
方法一.安裝SQL時選擇區分大小寫或安裝完以後重建mastar,選擇區分大小
C:\Program Files\Microsoft SQL Server\80\Tools\Binn\rebuildm.exe
方法二.sql server 8.0以上的版本才可以,7.0及其以下不支援
alter database 資料庫 COLLATE Chinese_PRC_CS_AS
修改定序,改成大小寫敏感的定序
如果只修改一個表,用alter table語句
如果修改一個庫的預設定序,用alter datebase語句
如果修改整個伺服器的預設定序,用Rebuildm.exe重建master庫
--指定定序就可以了
--樣本
select replace('AbacB' collate Chinese_PRC_CS_AS_WS,'B','test')
--如果你是要求表支援,則可以建表時指定定序,這樣replace就不用寫定序了
--樣本
create table tb(a varchar(20) collate Chinese_PRC_CS_AS_WS)
insert tb values('Abac')
select replace(a,'a','test') from tb
drop table tb
小結一下:
--表
ALTER TABLE tb
ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS
--不區分大小寫
ALTER TABLE tb
ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CS_AS
--區分大小寫
資料庫
ALTER DATABASE database
COLLATE Chinese_PRC_CS_AS
--區分大小寫
ALTER DATABASE database
COLLATE Chinese_PRC_CI_AS
--不區分大小寫
指定定序即可
Windows 定序名稱
在COLLATE子句中指定Windows定序名稱。Windows定序名稱由定序指標和比較風格構成。
文法:
<Windows_collation_name> :: =
CollationDesignator_<ComparisonStyle>
<ComparisonStyle> ::=
CaseSensitivity_AccentSensitivity
[_KanatypeSensitive [_WidthSensitive ] ]
| _BIN
參數
CollationDesignator
指定Windows 定序使用的基本定序。基本定序包括:
當指定按字典排序時應用其定序的字母表或語言
用於儲存非 Unicode 字元資料的字碼頁。
例如 Latin1_General 或法文,兩者都使用字碼頁 1252,或土耳其文,它使用字碼頁 1254。
CaseSensitivity
CI 指定不區分大小寫,CS 指定區分大小寫。
AccentSensitivity
AI 指定不區分重音,AS 指定區分重音。
KanatypeSensitive
Omitted 指定不區分大小寫,KS 指定區分假名類型。
WidthSensitivity
Omitted 指定不區分大小寫,WS 指定區分大小寫。
BIN
指定使用二進位排序次序。
如果你只是目前查詢區分,那麼還是不要這樣改,免得又反悔,如此查詢:
select * from a
/*
a_nam a_add
---------- ----------
1 aa
1 bb
2 cc
2 vv
2 kk
3 dd
3 ee
4 dd
5 ee
6 yy
6 yy
(11 row(s) affected)
*/
現在我們查詢a_add = 'aa'的,'Aa'等等不行!
Example 1:
select * from a
where a_add collate Chinese_PRC_CS_AS_WS = 'aa'
/*
a_nam a_add
---------- ----------
1 aa
(1 row(s) affected)
*/
Example 2:
select * from a
where a_add collate Chinese_PRC_CS_AS_WS = 'Aa'
/*
a_nam a_add
---------- ----------
(0 row(s) affected)
*/
方法三.上面的記不住,那麼就用最笨的方法,轉化為ascii
select * from a
where
ascii(substring(a_add,1,1)) = ascii(substring('Aa',1,1))
and
ascii(substring(a_add,2,1)) = ascii(substring('Aa',2,1))
/*
a_nam a_add
---------- ----------
(0 row(s) affected)
*/
方法三:任何版本都可以
select * from a
where cast(a_add as varbinary(10))= cast('aa' as varbinary(10))