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

博客讲述项目中因全角和半角括号字符差异导致SQL Server出现重复主键问题。原因是数据库排序规则未区分宽度,默认排序规则认同两者等效。正确做法是选择后缀为WS的中文排序规则,如Chinese_PRC_CI_AS_WS,还给出查看排序规则的SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*------------------------------------------------------------------------------------

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

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

/*------------------------------------------------------------------------------------

这是一个在我实际一个项目中遇到的问题。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%'

 

<think>我们正在讨论全角字符半角字符的区别,特别是数字5。 根据引用[1]:全角字符半角字符是指在计算机处理文本时,字符占用的空间不同。在东亚地区(如中国、日本、韩国)使用的字符集中尤其常见。 全角字符:通常占用两个字节(在早期系统中,一个全角字符相当于两个半角字符的宽度),用于汉字、假名等。全角数字也属于全角字符,它们与汉字等宽,因此在排版时与汉字对齐。 半角字符:通常占用一个字节,宽度是汉字的一半,主要是英文字母、数字常用符号。 全角数字5半角数字5的区别: 1. 编码存储: - 半角数字5:在ASCII编码中为0x35(十进制53),占用1个字节。 - 全角数字5:在GBK、Big5、Shift-JIS等双字节字符集中,通常用两个字节表示。例如,在GBK编码中,全角数字5的编码是0xA3B5(第一个字节0xA3,第二个字节0xB5)。 2. 显示宽度: - 半角数字5:在等宽字体中占据1个字符宽度。 - 全角数字5:在等宽字体中占据2个字符宽度(与一个汉字等宽)。 3. 使用场景: - 半角数字5:通常用于英文文本或编程代码中。 - 全角数字5:通常用于中文、日文等东亚文字文本中,以保持数字与汉字对齐。 示例: 半角数字5:`5` (看起来较窄) 全角数字5:`5` (看起来较宽,且与汉字宽度一致) 在编程中,如果误用了全角数字,编译器或解释器会将其视为非法字符,导致语法错误(如之前提到的ModelSim报错)。 转换方法: 根据引用[3],我们可以使用Python进行全角半角的转换。例如,将全角数字转换为半角数字: 全角数字5(Unicode码点为0xFF15)转换为半角数字5(Unicode码点0x35)只需减去一个偏移量(0xFEE0)。 转换公式: 半角字符 = 全角字符 - 0xFEE0 (对于非空格字符) 注意:空格字符需要特殊处理,全角空格(0x3000)对应半角空格(0x20)。 因此,在编程中,我们应始终使用半角数字(包括其他符号)以避免语法错误。 相关问题: §§相关问题§§ 1. 如何检测转换字符串中的全角字符半角字符? 2. 在哪些编程语言中全角字符会导致语法错误? 3. 全角字符数据库存储中会带来什么问题?</think>### 全角数字5与半角数字5的区别详解 #### 1. **本质区别** | 特性 | 半角数字5 | 全角数字5 | |--------------|--------------------|--------------------| | **Unicode编码** | U+0035 | U+FF15 | | **字节占用** | 1字节(ASCII) | 2-4字节(UTF-8) | | **显示宽度** | 标准英文字符宽度 | 等于一个汉字宽度 | | **输入方式** | 英文键盘直接输入 | 需切换中文输入法 | | **存储形式** | `00110101`(二进制)| `11101111 10111101 10010101`(UTF-8) | #### 2. **视觉对比** ```plaintext 半角:0123456789 ← 与英文字母等宽 全角:0123456789 ← 与汉字等宽 ``` ▷ **半角5**:`5`(宽度同字母"A") ▷ **全角5**:`5`(宽度同汉字"中") #### 3. **技术差异** - **内存占用**(UTF-8编码): - 半角5:`0x35`(1字节) - 全角5:`0xEF 0xBC 0x95`(3字节) - **编程识别**: ```python # Python示例 print(len("5")) # 输出1(半角) print(len("5")) # 输出1(显示长度)但实际占用3字节 print(ord("5")) # 输出53(U+0035) print(ord("5")) # 输出65301(U+FF15) ``` #### 4. **应用场景差异** | 场景 | 推荐使用 | 原因 | |--------------|------------|-------------------------| | 编程代码 | **半角5** | 编译器仅识别ASCII字符 | | 中文排版 | **全角5** | 与汉字宽度统一,排版美观 | | 数据库存储 | **半角5** | 节省存储空间,避免转换问题 | | 日/韩文文档 | **全角5** | 符合东亚文字排版规范 | #### 5. **相互转换方法** - **Python转换**(引用[3]): ```python def full2half(ustr): return ''.join(chr(0x3000 if c == 0x0020 else c-0xfee0) if 0xff00 < c < 0xff80 else chr(c) for c in map(ord, ustr)) print(full2half("5")) # 输出半角"5" ``` - **Oracle转换**(引用[2]): ```sql SELECT TO_SINGLE_BYTE('5') FROM dual; -- 返回半角"5" ``` #### 6. **错误案例分析** Verilog报错 `near "5": syntax error` 的根本原因: ▸ 代码中混入了全角数字 `5`(U+FF15),编译器无法识别非ASCII字符 ▸ 解决方案:用文本编辑器全局替换全角数字为半角(如VS Code的正则搜索:`[\uFF10-\uFF19]` → 匹配所有全角数字) > 💡 **编程黄金规则**: > **所有代码必须使用半角字符**,包括数字、括号运算符。全角字符仅用于自然语言文本排版[^1]。 --- ### 相关问题 1. **如何检测代码中的全角字符?** - 推荐使用VS Code插件**"Gremlins Tracker"** 可视化显示隐藏字符 - 正则表达式检测:`[\uFF00-\uFFFF]`(匹配所有全角字符) 2. **为什么数据库需要统一字符编码?** - 全角/半角混用会导致查询失败(如 `WHERE id = '5'` 无法匹配 `id=5`) - 存储空间差异:全角数字占用3倍存储空间(UTF-8) 3. **如何避免跨平台编码问题?** - 统一文件编码为 **UTF-8 without BOM** - 在.gitattributes中设置:`*.v text eol=lf charset=utf-8`
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值