mysql 去除不可见字符_字符串中的不可见字符应该如何清除?
发布日期:2021-06-24 12:40:37 浏览次数:2 分类:技术文章

本文共 1927 字,大约阅读时间需要 6 分钟。

在我的工作中,经常要做数据的导入导出,包括在程序上和直接在数据库上操作。由于客户提供的数据千差万别,很可能包含大量特殊的不可见的字符,如果直接导入到数据库中,可能会导致应用程序出现问题,或者数据库查询时出现意想不到的结果。这时,需要在导入过程中,把这些“杂质”先过滤掉,再导入到数据库中。当然也可以在数据库中操作,这就视实际情况而定了。

首先,如何在找到这些不可见的字符呢?用眼睛肯定是不行的,复制这些字符放到判断条件上?行不通。这时,ASCII(American Standard Code for Information Interchange),即美国标准信息交换代码帮上大忙。

5da747cb28fdf35986a31b96a14bd052.png

(此图片来源于百度)

e4ed67a19f10d8c5c1c9f11283f62e9e.png

计算机上所有字符都是在ASCII基础上进行扩展编码的,比如英文字符“A”的十进制编码是65,中文的“中”字的十进制编码是20013。关于ASCII编码,计算机字符集等知识,可上网或查阅相关资料,这里不再赘述。不过关于数据库的字符集,也是一个非常值得探讨的话题,在以后的文章中再与大家分享下自己的经验。

从上面的图片ASCII码值表中得知,十进制的0至31和127这33个编码是不可见的特殊字符(控制符)。所以,只要想方法把这些字符替换掉即可。以下是我写的函数。如果您有更好的方法,请多多指教哈。

1 IF OBJECT_ID(N'fn_trim_invisible_code') IS NOT NULL

2 BEGIN

3 DROP FUNCTIONfn_trim_invisible_code4 END

5 GO

6

7

8 /*去掉字符串的不可见字符,包括去掉字符串两边的空格*/

9 CREATE FUNCTION fn_trim_invisible_code(@str NVARCHAR(MAX)='')10 RETURNS NVARCHAR(MAX)11 AS

12 BEGIN

13 DECLARE @char NVARCHAR(MAX)14 DECLARE @i INT

15 SET @char = ''

16 SET @i = 1

17

18 WHILE @i <= LEN(@str)19 BEGIN

20 SET @char = @char + CASE WHEN UNICODE(SUBSTRING(@str,@i,1)) <= 31 OR UNICODE(SUBSTRING(@str,@i,1)) = 127

21 THEN ''

22 ELSE SUBSTRING(@str,@i,1)23 END

24 SET @i = @i + 1

25 END

26 RETURN RTRIM(LTRIM(@char))27 END

-----------------经@剑走江湖 的提醒,重新修改了函数,减少substring使用次数,测试后性能有所提升。谢谢!-------------

1 IF OBJECT_ID(N'fn_trim_invisible_code') IS NOT NULL

2 BEGIN

3 DROP FUNCTIONfn_trim_invisible_code4 END

5 GO

6

7

8 /*去掉字符串的不可见字符,包括去掉字符串两边的空格*/

9 /*如果字符串中间的空格也要去掉,把@ucode<=31修改为<=32即可*/

10 CREATE FUNCTION fn_trim_invisible_code(@str NVARCHAR(MAX)='')11 RETURNS NVARCHAR(MAX)12 AS

13 BEGIN

14 DECLARE @char NVARCHAR(MAX)15 DECLARE @ucode INT

16 DECLARE @str2 NVARCHAR(MAX)17 DECLARE @c NVARCHAR(1)18 DECLARE @i INT

19 SET @char = ''

20 SET @str2 = RTRIM(LTRIM(@str))21 SET @i = 1

22

23 WHILE @i <= LEN(@str2)24 BEGIN

25 SET @c = SUBSTRING(@str2,@i,1)26 SET @ucode = UNICODE(@c)27 SET @char = @char + CASE WHEN @ucode <= 31 OR @ucode = 127 THEN '' ELSE @c END

28 SET @i = @i + 1

29 END

30

31 RETURN (@char)32 END

33 GO

转载地址:https://blog.csdn.net/weixin_32804237/article/details/113327666 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c 删除mysql里记录_mysql 数据表中查找、删除重复记录
下一篇:mysql 命令行 导入 乱码_通过命令行导入到mysql数据库时出现乱码的解决方法

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月03日 13时07分07秒