sql - 如何在 SQL 中处理 Unicode 替换字符 � (0xFFFD/65533)

标签 sql sql-server unicode

一周前我什至都不知道 Unicode 替换字符 (�) 的存在。现在我了解到至少在 SQL 中似乎有一些非常特殊和奇怪的逻辑围绕着它。例如:

select replace(N'bl' + NCHAR(65533) + N'rt', NCHAR(65533), N'X')

返回 bl�rt 而不是 blXrt。并且:

select CHARINDEX(NCHAR(65533), N'b' + NCHAR(65533) + N't')

返回 0 而不是 2。我只是想确定表中的哪些字符串包含此字符,但我找不到直接的方法来执行此操作。这个角色的处理如此奇怪,一定还有更多我可以学习的地方。行为在哪里定义,更具体地说,在 MS SQL Server 数据库中查找包含此字符的字符串的最简单方法是什么?

编辑 对于任何尝试答案的人,我建议使用以下数据测试您的答案:

create table Test([Value] nvarchar(100) not null)
insert into Test([Value]) values('b' + NCHAR(65533) + 't')
insert into Test([Value]) values('b?t')
insert into Test([Value]) values('bat')

最佳答案

Krzysztof Kozielczyk 写道,有效的 unicode 字符需要转换为二进制字符串才能进行替换,因此这可能是您最初问题的答案。

SELECT REPLACE(N'test' + NCHAR(65533) 
COLLATE Latin1_General_BIN, NCHAR(65533) COLLATE Latin1_General_BIN, '')

上面的代码还指出了如何查找具有有效 unicode 字符的字符串,但它是一种解决方法,而不是解决方案。 source

关于sql - 如何在 SQL 中处理 Unicode 替换字符 � (0xFFFD/65533),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30240308/

相关文章:

java.sql.SQLException : An attempt by a client to checkout a Connection has timed out 异常

mysql - SQL 'LIKE BINARY' 比普通 'LIKE' 慢吗?

java - MyBatis 3 - 从映射器获取 SQL 字符串

SQL LIKE 运算符不适用于逗号分隔列表

SQL Server 探查器不显示 LINQ To Sql 查询

c# - 如何将unicode数据保存到oracle?

asp.net - 有没有办法以编程方式确定字体文件是否具有特定的Unicode字形?

java - "\n"是垂直空格吗,即 "\v"应该匹配它吗?

mysql - 如何创建一个 SQL 选择,为一个范围创建所有数据并计算出现次数

sql - SQLite 中的 Oracle INSTR 替换