是否可以让 SQL Server 将排序规则转换为 UTF-8 / UTF-16

Posted

技术标签:

【中文标题】是否可以让 SQL Server 将排序规则转换为 UTF-8 / UTF-16【英文标题】:Is it possible to have SQL Server convert collation to UTF-8 / UTF-16 【发布时间】:2015-07-28 15:40:43 【问题描述】:

在我正在处理的项目中,我的数据存储在 SQL Server 中,排序规则为 Danish_Norwegian_CI_AS。数据通过 FreeTDS 和 ODBC 输出到以 UTF-8 格式处理数据的 python。一些字符,如 å、ø 和 æ,没有正确编码,导致项目进度停滞不前。

我花了几个小时阅读关于编码、整理和代码页的混乱世界,感觉我对整个画面有了更好的理解。

我读过的一些文章让我觉得有可能: 在 SQL select 语句中指定排序数据在输出时应编码为 UTF-8。

我认为这是可能的原因是this article,它展示了如何使用不同排序规则的表格来一起玩的示例。

任何将排序规则转换为 UTF-8 / UTF-16 的指针,将不胜感激!

编辑:我已经读到 SQL Server 通过ncharnvarcharntext 提供了一个 unicode 选项,并且其他字符串变量 charvarchartext 是根据设置编码的整理。我还读到上面提到的 unicode 选项是用 utf-16 变体 ucs-2 编码的(我希望我没记错)。所以;为了让locale collat​​ion和unicode的表能很好玩,应该有转换功能吧?

【问题讨论】:

在使用 mysql 和 jdbc 时遇到了类似的问题,这解决了我的问题。使用create table a(.....) DEFAULT CHARSET=utf8; 创建表并使用'"jdbc:mysql://localhost/testDb?useUnicode=true&characterEncoding=UTF-8"; 连接到数据库所以我认为MS SQL 服务器必须有一种方法 @SkarosIlias 感谢您的意见。不幸的是,该表已经创建并填充,所以这不是我的选择。 尝试使用新表并插入一些测试数据以确保其正常工作。如果它确实执行alter table 您可以将每个字段的编码排序规则放在 SqlServer 中。因此,您需要使用备用编码的第二个字段。我会在内存临时表中执行此操作,并在两个字段上进行显式排序。这两个字段中的数据可能看起来相同,但其中一个具有不同的排序规则。如果这可行,那么您可以微调更多。此外,我会尝试在客户端独立于 Sql 更改编码类型。从 UTF-8 到二进制到丹麦挪威语。 @SkarosIlias 那么有可能改变整个表格吗?问题在于我们的 ERP 系统使用了该数据库。所以更改编码不是一个选项:S 我必须从整理表中获取输出,如 utf-8 或 utf-16 .. 【参考方案1】:

4 个月过去了,我终于找到了问题的答案。原来它与 FreeTDS 驱动程序或数据库排序规则无关:

这是 pyodbc 的连接函数,显然需要一个标志; unicode_results=True

张贴在这里是为了帮助其他注定在黑暗中漫无目的地徘徊的不幸灵魂,寻找线索。

【讨论】:

谢谢。我在黑暗中漫无目的地徘徊,您的回答帮助我找到了comparable UTF-8 setting in the Microsoft SQLSRV driver。 (SQLSRV 是 ODBC 驱动程序的包装器。)我使用了连接选项,但驱动程序也支持setting the encoding on a statement-by-statement basis。【参考方案2】:

SQL 似乎不支持 UTF-8(请参阅 here),但您可以尝试更改 select 中的排序规则,例如:

SELECT Account COLLATE SQL_Latin1_General_CP1_CI_AS
from Data

您还可以使用此解决方案去除重音:How to remove accents and all chars <> a..z in sql-server?

另一种解决方案可能是将您的列转换为 nvarchar

SELECT cast (Account as nvarchar) as NewAccount 
from Data

其中 Account 是初始表上的 varchar。

例如,如果您尝试:

SELECT cast(cast(N'ţ' as varchar) as nvarchar)

最终结果将是“ţ”

【讨论】:

以上是关于是否可以让 SQL Server 将排序规则转换为 UTF-8 / UTF-16的主要内容,如果未能解决你的问题,请参考以下文章

SQL server中的物理排序和逻辑排序是怎么回事

SQL Server转换数据库的排序规则

SQL Server:尽管进行了转换,但无法解决排序规则冲突

SQL server中如何更改排序规则

将 SQL Server 数据库转换为 MySQL

客户端排序规则和 SQL Server 2005