最近碰到的一个问题。首先服务器排序规则是Chinese_PRC_CI_AI.
数据库排序规则是Chinese_PRC_CI_AI
表A COL列Chinese_PRC_CI_AI
视图B COL列Chinese_PRC_CI_AS视图B所包含的表对应链接列均为Chinese_PRC_CI_AI。 为何一个计算列SID排序规则为Chinese_PRC_CI_AS。
另外如何修改计算列的排序规则。order by
collate ××× asc 的方法已经用过,不成。PS:
另外测试一下之前说的API。看成不成功。呵呵!
数据库排序规则是Chinese_PRC_CI_AI
表A COL列Chinese_PRC_CI_AI
视图B COL列Chinese_PRC_CI_AS视图B所包含的表对应链接列均为Chinese_PRC_CI_AI。 为何一个计算列SID排序规则为Chinese_PRC_CI_AS。
另外如何修改计算列的排序规则。order by
collate ××× asc 的方法已经用过,不成。PS:
另外测试一下之前说的API。看成不成功。呵呵!
解决方案 »
- SQL2008客户端如何访问服务器上的SQL2005
- varchar中null的查询问题
- 如何把更新的结果集写到数据库表中
- 关于isnull的奇怪问题
- 如何防止sql server因为程序上的不合理访问导致数据库缓慢?
- 模版表定义触发器?
- SQL SERVER 2000与SQL SERVER 2005能安装在同一台机上吗?
- SQL直接备份数据库,重装系统后无法进行数据恢复(在线等)5分
- java链接sql server 2000,需要用到的sql语句有4条,用下面形式嵌套的执行得到的结果会正确吗?
- 请问怎么取论坛最后发表的语句?
- MSSQL有 类似于 SPLIT的函数吗?
- SQL2000备份的数据为什么在SQL2005中直接还原不行???
DROP TABLE [tb]
GO
CREATE TABLE [tb]([A] NVARCHAR(10),[B] NVARCHAR(10),[C] INT,[d] NVARCHAR(10))
INSERT [tb]
SELECT 'a1','b1',1,'aa' UNION ALL
SELECT 'a1','b1',2,'c1' UNION ALL
SELECT 'a1','b1',3,'d3' UNION ALL
SELECT 'a2','b2',1,'56' UNION ALL
SELECT 'a2','b2',2,'d4' UNION ALL
SELECT 'A3','B3',3,'d5'
GOSELECT A COLLATE CHINESE_PRC_CI_AI,B COLLATE CHINESE_PRC_CI_AS
FROM TB
ORDER BY B COLLATE CHINESE_PRC_CI_AS DESC这样不成吗?
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_AS2.--1. 为数据库指定排序规则
CREATE DATABASE db COLLATE Chinese_PRC_CI_AS
GOALTER DATABASE db COLLATE Chinese_PRC_BIN
GO
/*====================================*/
--2. 为表中的列指定排序规则
CREATE TABLE tb(
col1 varchar(10),
col2 varchar(10) COLLATE Chinese_PRC_CI_AS)
GOALTER TABLE tb ADD col3 varchar(10) COLLATE Chinese_PRC_BIN
GOALTER 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 tbdrop table tb指定排序规则即可Windows 排序规则名称
在 COLLATE 子句中指定 Windows 排序规则名称。Windows 排序规则名称由排序规则指示器和比较风格构成。 语法
< Windows_collation_name > :: = CollationDesignator_ <ComparisonStyle> < ComparisonStyle > ::=
CaseSensitivity_AccentSensitivity
[_KanatypeSensitive [_WidthSensitive ] ]
| _BIN 参数
CollationDesignator 指定 Windows 排序规则使用的基本排序规则。基本排序规则包括: 当指定按字典排序时应用其排序规则的字母表或语言
用于存储非 Unicode 字符数据的代码页。
例如 Latin1_General 或法文,两者都使用代码页 1252,或土耳其文,它使用代码页 1254。 CaseSensitivityCI 指定不区分大小写,CS 指定区分大小写。AccentSensitivityAI 指定不区分重音,AS 指定区分重音。KanatypeSensitiveOmitted 指定不区分大小写,KS 指定区分假名类型。WidthSensitivityOmitted 指定不区分大小写,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))
tony 可能我没说清楚。 修改表中字段可以顺利达到效果。也可以用alter 直接修改过来。
关键是在视图中的计算列,比如 TB1.col1+TB2.col2 的这个列,系统自动默认为了Chinese_PRC_CI_AS
让我很是奇怪。
小F 对应这个帖子,我也参考了的。
里面用于修改已有表或者视图的排序只有两种方式:
1、ALTER TABLE tb ALTER COLUMN col2 varchar(10) COLLATE Chinese_PRC_BIN GO
2、Order BY可order by 对于视图中的一个计算列,没有达到排序规则的变更效果。
不知,有否其它方式?另外,最让我疑问的是,为何都是Chinese_PRC_CI_AI的规则,计算列偏偏出个Chinese_PRC_CI_AS
谢谢tony这么快的回复。 SELECT TB1.col1+TB2.col2 Collate Chinese_PRC_CI_AI 的方式修改不过来。
另外,TB1.col1,TB2.col2 列都是Chinese_PRC_CI_AI 个规则。
谢谢鸟。
问题不知原因,但是已经解决。
我重建A表。用的是一样的脚本。
然后连接B视图,用select A.col1 collate ***的方式,就可以了。
奇怪状态。