Sql server 使用TRANSLATE函数替换Unicode字符

Sql server 使用TRANSLATE函数替换Unicode字符,sql-server,tsql,unicode,Sql Server,Tsql,Unicode,一位客户要求在其SQL数据库中创建从特定名称到ASCII的自定义字符映射器函数 下面是一个简化的片段(为简洁起见缩短): 在分析客户数据集的结果时,我注意到还有一个未映射的符号ă。因此,我将其添加到映射器中,如下所示: select TRANSLATE(N'àáâãäåāąæậạảă', N'àáâãäåāąæậạảă', N'aaaaaaaaaaaaa'); 意外地,它开始失败,并显示以下消息: The secon

一位客户要求在其SQL数据库中创建从特定名称到ASCII的自定义字符映射器函数

下面是一个简化的片段(为简洁起见缩短):

在分析客户数据集的结果时,我注意到还有一个未映射的符号ă。因此,我将其添加到映射器中,如下所示:

select TRANSLATE(N'àáâãäåāąæậạảă', 
                 N'àáâãäåāąæậạảă', 
                 N'aaaaaaaaaaaaa');
意外地,它开始失败,并显示以下消息:

The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.
显然,
TRANSLATE
认为ă是特殊的,由多个字符组成。事实上,即使是记事本也有同样的想法(复制一个̆并尝试使用退格键删除它-会发生一些不寻常的事情。不过,删除键工作正常)

然后我想-如果TRANSLATE认为它是两个字符的符号,那么让我们添加一个两个字符的映射,然后:

select TRANSLATE(N'àáâãäåāąæậạảă', 
                 N'àáâãäåāąæậạảă', 
                 N'aaaaaaaaaaaaaa');
这次没有错误,耶。但输入字符串未正确处理,ă未替换为a


替换这种“双符号”的正确(区分大小写)方法是什么?可以用翻译吗?我不想为我找到的每一个这样的符号添加一堆替换。

Unicode字符是什么意思?此页中的所有字符都是Unicode。此注释中的所有字符都相同。这项要求本身就非常可疑,需要加以解释和说明。很可能不需要这样的“映射”,数据库排序规则应该是固定的,而不是“双符号”——你运气不好。有些字符可以通过组合变音符号来生成,有些字符已经足够老了,它们有自己的Unicode字符。glyph可以是单个字符,也可以是两个或多个字符的组合。SQL,这种语言不是为文本操作而构建的,绝对不是为Unicode转换而构建的。@PanagiotisKanavos尽管许多符号可能是Unicode(但有些可能属于扩展拉丁字符集),但仍然只有少数会产生此类问题。例如-ă和æ̆中断翻译,但ĕ不翻译。我尝试了多个排序规则,但没有一个能给出客户所需的准确结果,这就是为什么我要尝试手动映射它们。它根本不知道Unicode。如果您真的想替换这些字符,您必须使用SQLCLR函数并在C#中进行替换,使用诸如将多个表单规范化为一个表单的方法,以及诸如IsSurrogate、ispuncuation等应该会有所帮助。使用接受答案中的方法产生
aaaaaaaaæaaaaaa
æ
不会转换,因为它*不是重音的
a
。它是A和E,就像英国国王一样。这个名字也有拼写
select TRANSLATE(N'àáâãäåāąæậạảă', 
                 N'àáâãäåāąæậạảă', 
                 N'aaaaaaaaaaaaaa');