首页 > 解决方案 > 如何从sql中的字符串中删除双字节空间

问题描述

我在数据库表中有一个包含项目编号的列。其中一项包含双字节空间**400-000361(SZ17-20)**。当这个项目的详细信息从系统中导出时,它会在 csv 中删除这个空间并显示如下项目编号**400-000361(SZ17-20)**

当我尝试使用查询将导出的数据与系统的数据进行比较时,它不会列出该项目,因为该数字现在已更新。有什么方法可以忽略双空格字符以使用正则表达式或其他方式获取匹配项?我尝试了以下方式,但它不起作用

SELECT REGEXP_REPLACE('400-000361(SZ17-20)', '\s{2,}', ' ') T FROM dual 
WHERE '400-000361(SZ17-20)' = TRIM(REGEXP_REPLACE('400-000361(SZ17-20)', '([[:space:]]{2,}|[[:cntrl:]])', ' '))

标签: sqloracleunicode

解决方案


您没有双倍空间或双字节空间,或者实际上根本没有任何空间。您有一个全角左括号,显然在您的导出过程中被转换为标准括号。

你可以看到你真正拥有的东西dump()

SELECT dump('400-000361(SZ17-20)', 1016) FROM dual;

Typ=96 Len=21 CharacterSet=AL32UTF8: 34,30,30,2d,30,30,30,33,36,31,ef,bc,88,53,5a,31,37,2d,32,30,29
                                                                   ^^^^^^^^

并与修改后的版本进行比较:

SELECT dump('400-000361(SZ17-20)', 1016) FROM dual;

Typ=96 Len=19 CharacterSet=AL32UTF8: 34,30,30,2d,30,30,30,33,36,31,28,53,5a,31,37,2d,32,30,29
                                                                   ^^

您可以使用replace()等效的 Unicode 字符串转换表数据:

SELECT REPLACE('400-000361(SZ17-20)', unistr('\ff08'), '(') T FROM dual 
WHERE '400-000361(SZ17-20)' = REPLACE('400-000361(SZ17-20)', unistr('\ff08'), '(')

400-000361(SZ17-20)

db<>小提琴


推荐阅读