Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否可以让SQL Server将排序规则转换为UTF-8/UTF-16_Sql Server_Unicode_Utf 8_Collation_Pyodbc - Fatal编程技术网

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

Sql server 是否可以让SQL Server将排序规则转换为UTF-8/UTF-16,sql-server,unicode,utf-8,collation,pyodbc,Sql Server,Unicode,Utf 8,Collation,Pyodbc,在我正在处理的一个项目中,我的数据存储在SQL Server中,排序规则为Danish\u Norwegian\u CI\u AS。数据通过FreeTDS和ODBC输出到python,python以UTF-8的形式处理数据。有些字符,如å、ø和æ,编码不正确,导致项目进度停滞 我花了几个小时阅读关于编码、排序和代码页的混乱世界,感觉我对整个画面有了更好的理解 我读过的一些文章使我认为有可能:在SQL select语句中指定排序规则数据在输出时应编码为UTF-8 我之所以认为这是可能的,是因为它展

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

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

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

我之所以认为这是可能的,是因为它展示了一个示例,说明了如何使用不同的排序规则访问表,以便更好地协作

如有任何关于将排序规则转换为UTF-8/UTF-16的指示,将不胜感激


编辑:我了解到SQL Server通过
nchar
nvarchar
ntext
提供了一个unicode选项,并且其他字符串变量
char
varchar
text
是根据设置的排序规则编码的。我还读到,上面提到的unicode选项是用utf-16变体ucs-2编码的(我希望我记住了这一点)。所以为了允许使用区域设置排序规则和unicode表,为了更好地发挥作用,应该有一个转换函数,否?

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

SELECT Account COLLATE SQL_Latin1_General_CP1_CI_AS
from Data
您还可以使用此解决方案去除口音:

另一个解决方案可能是将您的专栏转换为nvarchar

SELECT cast (Account as nvarchar) as NewAccount 
from Data
其中Account是初始表上的varchar

例如,如果您尝试:

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

最终结果将是“ţ”

4个月后,我终于找到了问题的答案。结果发现它与FreeTDS驱动程序或数据库排序规则无关:

这是pyodbc的connect函数,它显然需要一个标志<代码>unicode_结果=真


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

使用mySQL和jdbc时遇到类似的问题,这就解决了我的问题。使用
创建表a(…)默认字符集=utf8创建表并使用“
”jdbc连接到数据库:mysql://localhost/testDb?useUnicode=true&characterEncoding=UTF-8";altertable
,您可以在SqlServer中放置每个字段的编码排序规则。所以,您需要第二个具有备用编码的字段。我将在内存中的临时表中执行此操作,并对两个字段进行显式排序。两个字段中的数据看起来可能相同,但其中一个字段的排序规则不同。如果这起作用,那么您可以再微调一些。另外,我将尝试在客户端独立于Sql更改编码类型。从UTF-8到二进制到丹麦语-挪威语。@SkarosIlias那么有可能改变整个表格吗?问题是我们的ERP系统使用数据库。因此,更改编码不是一个选项:我必须从已整理的表中获取输出,如utf-8或utf-16..谢谢。我在黑暗中漫无目的地徘徊,你的回答帮助我找到了答案。(SQLSRV是ODBC驱动程序的包装器。)我使用了连接选项,但驱动程序也支持。