`

SQLServer中全角和半角字符的比较问题

    博客分类:
  • SQL
阅读更多
/*------------------------------------------------------------------------------------


/*欢迎转载,请保留本声明信息


/*作者:翁 彦 enhydraboy@yahoo.com.cn

/*------------------------------------------------------------------------------------ http://www.mscto.com

这是一个在我实际一个项目中遇到的问题。03BHL01001(上海)和03BHL01001(上海)比较的结果是一样的。导致引起的重复的主键问题。

03BHL01001(上海)和03BHL01001(上海)差别,就在于前者的括号是全角的括号字符,后者是半角的括号字符。全角的括号字符和半角的括号字符的ascii码显然是不一样的。全角的( ASCII码是0xA3A8 ,而半角的( 是0x28。那么为什么SQL Server会认为是一样的呢?

问题其实就出在数据库的排序规则上,让我们在仔细研读一下SQL Server的文档。SQL Server的排序规则由这样几部分组成,代码页、区分大小写、区分重音、区分宽度。最后一个在SQL Server的联机帮助中没有进一步提及,其实本篇遇到的问题就是由于这个原因造成的。区分宽度:指定 SQL Server 区分相同字符的单字节表示法(半角)和双字节表示法(全角)。如果没有选择,则 SQL Server 将认为相同字符的单字节表示法和双字节表示法等效。


缺省,安装SQL Server中文版的时候,SQL Server帮你选择的排序规则是Chinese_PRC_CI_AS(Chinese-PRC, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive),是中文,不区分大小写、区分重音、不区分假名、不区分宽度。因此,自然就认同03BHL01001(上海)=03BHL01001(上海)。
所以,正确的选择应该是,后缀为WS的中文排序规则。本例中我们应该选择Chinese_PRC_CI_AS_WS。

我们来看一下,指定排序规则是Chinese_PRC_CI_AS_WS后,怎么样了?

select 1 where '03BHL01001(上海)'='03BHL01001(上海)'

collate Chinese_PRC_CI_AS_WS


(所影响的行数为 0 行)

看来这个问题解决了。

重要提示:

如何察看使用那个排序规则呢?可以使用下面的SQL语句。
查询所有排序规则的信息:
SELECT * FROM ::fn_helpcollations()


查出所有中文排序规则的信息 :
SELECT * FROM
(SELECT * FROM ::fn_helpcollations()) A
WHERE name like 'Chinese%'
分享到:
评论

相关推荐

    SqlServer数据库全角转换成半角

    SqlServer数据库全角转换成半角,需要的朋友可以参考一下

    SQL SERVER 2000开发与管理应用实例

    4.2.2 全角与半角字符处理 120 第 5 章 编号处理 123 5.1 自动编号 123 5.1.1 IDENTITY 123 5.1.2 ROWGUIDCOL 129 5.2 手工编号 131 5.2.1 查表法 131 5.2.2 独立编号表法 135 5.2.3 随机...

    收集整理的SQL Server自定义函数

    收集整理的SQL Server自定义函数,原文地址:http://blog.csdn.net/maco_wang 1.去除字符串中的html标记及标记中的内容 2 2. 去除字符串中连续的分割符 4 3.求第一个字符串中第二个串的个数 ...38.全角半角转换函数 71

    Sqlserver2000经典脚本

    非法字符串处理.sql │ ├─第04章 │ │ 4.1.5 在各种处理中应用排序规则的示例.sql │ │ 4.2.1 排序规则在拼音处理中的应用.sql │ │ 4.2.2 排序规则在全角与半角处理中的应用.sql │...

    sqlserver自定义函数

    --全角和半角转换函数 Create FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )RETURNS nvarchar(4000) AS BEGIN DECLARE @pat nvarchar(8)...

    sqlserver2000基础(高手也有用)

    4.2.2 全角与半角字符处理 120 第 5 章 编号处理 123 5.1 自动编号 123 5.1.1 IDENTITY 123 5.1.2 ROWGUIDCOL 129 5.2 手工编号 131 5.2.1 查表法 131 5.2.2 独立编号表法 135 5.2.3 随机编号 ...

    经典SQL脚本大全

    │ │ 4.2.2 排序规则在全角与半角处理中的应用.sql │ │ │ └─其他 │ 生成GB2312汉字表.sql │ 生成GBK汉字表.sql │ 自动获取汉字笔画.sql │ ├─第05章 │ │ 5.1.1 SET IDENTITY_INSERT 中的几个问题.sql...

    企业客户管理

    (2)在解决方案资源管理器中打开BaseClass文件夹中的BaseOperate.cs类文件,将“建立数据库连接”方法中的连接字符串的Data Source属性设置为本机SQL Server 2005服务器名称,然后单击保存按钮,保存所做的更改。...

    ASP.NET编程之道.part1.rar

    谬误10 .NET和SQL Server中“空值”是一回事 谬误11 C#的结构和C++的完全一样 谬误12 方法中只有引用类型的参数才能实现引用传递 谬误13 字符串是值类型 谬误14 数据绑定表达式中Eval功能等价于Bind 谬误15 .Net中的...

    RS高校教师档案管理系统源码 RSUniversityTeachersArchives.rar

    RS高校教师档案管理系统源码 源码描述: 一、源码特点 这是一款高校教师档案管理系统源码,本系统操作员分为... 5、在本系统中填写信息时,有时需要将五笔输入法的全角状态改为半角状态,否则程序可能会弹出错误提示

    RS高校教师档案管理系统源码

    一、源码特点 这是一款高校教师档案管理系统源码,本系统操作员分为两种,一种是管理员,一种是普通用户也就是... 5、在本系统中填写信息时,有时需要将五笔输入法的全角状态改为半角状态,否则程序可能会弹出错误提示

    C++Builder精彩编程实例集锦的源代码前3部分.rar

    实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的...

    C++Builder精彩编程实例集锦的源代码后3部分.rar

    实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的...

    第一部分 界面设计

    实例073 如何将全角字符串转换成半角字符串 实例074 如何按照指定的有效位数转换数字 实例075 如何获取汉字的拼音索引 实例076 如何设置输入方法 实例077 如何控制数据输入格式 实例078 如何控制编辑框中的...

    高校教师档案管理系统 1.0

    2、管理员用户名为“mr”,密码为“mrsoft”3、默认数据库连接字符串在webconfig配置文件中修改4、DB文件夹中是数据库文件,附加即可5、在本系统中填写信息时,有时需要将五笔输入法的全角状态改为半角状态,否则...

Global site tag (gtag.js) - Google Analytics