为了账号安全,请及时绑定邮箱和手机立即绑定

如何修改数据库的服务器排序规则

如何修改数据库的服务器排序规则

一只名叫tom的猫 2019-03-16 16:11:18
如何修改数据库的服务器排序规则
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您好,很高兴为您解答。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

1.sp_helpsort 

SELECT SERVERPROPERTY ('Collation') 

查看你的排序规则. 

不过你的这个应该和字符集有关.

  

2.更改服务器排序规则 

更改 SQL Server 2005 实例的默认排序规则的操作可能会比较复杂,包括以下步骤: 

  

确保具有重新创建用户数据库及这些数据库中的所有对象所需的全部信息或脚本。 

使用工具(例如大容量复制)导出所有数据。

删除所有用户数据库。 

重新生成在 setup 命令的 SQLCOLLATION 属性中指定新的排序规则的 master 数据库。例如: 

复制代码 

start /wait setup.exe /qb INSTANCENAME=MSSQLSERVER REINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD=test SQLCOLLATION=SQL_Latin1_General_CP1_CI_AI 

有关重新生成 master 数据库的详细信息,请参阅如何重新生成 SQL Server 2005 的 Master 数据库。 

创建所有数据库及这些数据库中的所有对象。 

导入所有数据。 

注意:  

可以为创建的每个新数据库指定默认排序规则,而不更改 SQL Server 2005 实例的默认排序规则。 

  

3.设置和更改数据库排序规则 

创建新数据库时,可以使用下列内容之一指定排序规则: 

CREATE DATABASE 语句的 COLLATE 子句。 

SQL Server Management Studio. 

SQL 管理对象 (SMO) 中的 Database.Collation 属性。 

如果未指定排序规则,则使用服务器排序规则。 

可以使用 ALTER DATABASE 语句的 COLLATE 子句来更改在用户数据库中创建的任何新对象的排序规则。使用此语句不能更改任何现有用户定义的表中列的排序规则。使用 ALTER TABLE 的 COLLATE 子句可以更改这些列的排序规则。 

更改数据库排序规则时,需要更改下列内容: 

数据库的默认排序规则,这一新的默认排序规则将应用于数据库中后续创建的所有列、用户定义的数据类型、变量和参数。根据数据库中定义的对象解析 SQL 语句中指定的对象标识符时,也使用新的默认排序规则。 

将系统表中的任何 char、varchar、text、nchar、nvarchar 或 ntext 列更改为使用新的排序规则。 

将存储过程和用户定义函数的所有现有 char、varchar、text、nchar、nvarchar 或 ntext 参数和标量返回值更改为使用新的排序规则。 

将 char、varchar、text、nchar、nvarchar 或 ntext 系统数据类型和基于这些系统数据类型的所有用户定义的数据类型更改为使用新的默认排序规则。 

  

SQL code :

  

1.将数据库的字符集修改为:

alter database dbname collate Chinese_PRC_CI_AS

  

2.

  

--1. 为数据库指定排序规则

CREATE DATABASE db COLLATE Chinese_PRC_CI_AS

GO

  

ALTER DATABASE db COLLATE Chinese_PRC_BIN

GO

  

  

/*====================================*/

  

  

--2. 为表中的列指定排序规则

CREATE TABLE tb(

col1 varchar(10),

col2 varchar(10) COLLATE Chinese_PRC_CI_AS)

GO

  

ALTER TABLE tb ADD col3 varchar(10) COLLATE Chinese_PRC_BIN

GO

  

ALTER TABLE tb ALTER COLUMN col2 varchar(10) COLLATE Chinese_PRC_BIN

GO

  

  

/*====================================*/

  

  

--3. 为字符变量和参数应用排序规则

DECLARE @a varchar(10),@b varchar(10)

SELECT @a='a',@b='A'

  

--使用排序规则 Chinese_PRC_CI_AS

SELECT CASE WHEN @a COLLATE Chinese_PRC_CI_AS = @b THEN '@a=@b' ELSE '@a<>@b' END

--结果:@a=@b

  

--使用排序规则 Chinese_PRC_BIN

SELECT CASE WHEN @a COLLATE Chinese_PRC_BIN = @b THEN '@a=@b' ELSE '@a<>@b' END

--结果:@a<>@b

  

  

3.

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 --不区分大小写

  

  

方法一.安装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

  

指定排序规则即可

  

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))


 


查看完整回答
反对 回复 2019-03-20
  • 2 回答
  • 0 关注
  • 459 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信