在 SQL Server 上保存拉丁字符时出现问题

Issue saving Latin characters on SQL Server

提问人:Josy Sclei 提问时间:11/17/2023 最后编辑:Josy Sclei 更新时间:11/17/2023 访问量:73

问:

使用 Latin_General_CI_AS 作为默认排序规则将文本数据保存到 SQL Server 2019 数据库时,我遇到了问题。有问题的列设置为 varchar。当客户端输入像 não 这样的单词时,它会正常保存而不会出现问题,但是如果他复制+粘贴该单词,它会保存为 n~ao。调试 我发现在复制粘贴而不是使用 unicode 字符“ã”时,它使用组合变音符号“~”加上字母“a”,看起来 varchar 无法处理它。

我已经看到更改为 nvarchar 可能会解决这个问题,但我需要在很多列上执行此操作,除了更改列数据类型之外,还有其他方法可以解决这个问题吗?

sql-server unicode varchar

评论

2赞 T N 11/17/2023
我不认为这是SQL Server问题。听起来更像是一个UI问题。VARCHAR 的 SQL Server 默认字符集似乎可以同时处理两者,而且很好。请参阅此 db<>fiddle。不过,VARCHAR 类型确实有限制。也许你得到的角色不是一个简单的波浪号,而是一个特殊的独角兽组合角色。'não''n~ao''~'
2赞 T N 11/17/2023
...呃。。。“UNICODE”组合字符,而不是 🦄 .
1赞 Martin Smith 11/17/2023
据推测,这是排序规则的代码页不支持的字符,因此它被转换为常规波浪号 dbfiddle.uk/gcQ1pZD_U+0303U+007E

答:

2赞 Ben 11/17/2023 #1

将数据类型更改为是解决该问题的一种方法。nvarchar

解决此问题的另一种方法是使用排序规则更改数据库和/或表的设置,例如某些不区分大小写和不区分重音的比较,这些比较可以很好地处理拉丁字符。Latin_General_CI_AI

通常使用,因为它具有比nvarcharvarchar

评论

0赞 Josy Sclei 11/17/2023
忘了补充我们已经在使用Latin_General_CI_AI排序规则
0赞 Ben 11/17/2023
那么我真的认为数据类型是需要的,而不是使用nvarcharvarchar