【问题标题】:SQL column of type varchar creates � symbols when read into SASvarchar 类型的 SQL 列在读入 SAS 时创建 � 符号
【发布时间】:2018-08-03 20:17:26
【问题描述】:

我正在使用基本的 libname 和数据步骤从 SQL 表中将数据读入 SAS。但是,某些“特殊字符”(在本例中为破折号)被读取为带有问号的黑色菱形:

我知道这是由编码问题引起的 - SQL 列的数据类型为 varchar,SAS 无法正确读取(请详细说明为什么会发生这种情况)。我知道的一个解决方案是将列更改为输入nvarchar;但是,我不拥有数据库,因此无法更改。

我尝试了各种与编码、inencoding 和 outencoding 相关的选项(在 libname 和 data 步骤中),但无法获得正确的组合,如果有的话。

我目前的解决方法是创建一个使用CAST 转换数据类型的视图,并将视图读入 SAS。但是,我确信必须有一个编码解决方案 - 有人知道吗?

【问题讨论】:

  • 您的 SAS 会话使用什么编码?你告诉它使用什么编码来连接到 SQL Server?
  • 请注意,数据库中的字符不是 ASCII 代码破折号。它可能是一些用于 en-dash 或 em-dash 符号的 Unicode 字符串。
  • “varchar 数据类型,处理 ASCII 字符”:不,varchar 处理来自关联排序规则的字符——不太可能是 ASCII。您用于查询数据库的代码在将字节转换为 Unicode 时应该使用该代码。
  • This link 告诉我这将是 ASCII(第 3 个答案),并且是 Google 为我提出的第一件事,但在谷歌搜索后我可以看到它是不正确的。 .. SQL 中的排序规则是“Latin1_General_CI_AS”,SAS 会话编码使用 UTF-8。连接到 SQL 的 libname 没有指定编码,我不确定如何检查 - 这很可能是我的问题。

标签: sql-server character-encoding sas ssms


【解决方案1】:

在 ASCII 中,“U+FFFD � REPLACEMENT CHARACTER”用于替换未知、无法识别或无法表示的字符。如果这是唯一引起您问题的字符,您可以简单地将其转换为破折号。

例如,让我们用破折号替换 � 值:

data have;
    length character $20.;
    infile datalines dlm=',';
    input character$;
    datalines;
Sugar�free
Camera�ready
Custom�built
;
run;

data want;
    set have;

    character = tranwrd(character, '�', '-');
run;

如果这不起作用,这里有一个替代选项。

第 1 步:查找字符的单个示例并获取其 ASCII 十六进制代码

data hex_code;
    set have(obs=1);
    ascii_hex = put(substr(character, 6, 1), $hex.);
run;

在这种情况下,十六进制代码是1A。我们可以将其用作十六进制文字来替换违规字符。

第 2 步:将 tranwrd 与您找到的十六进制文字一起使用

SAS 会自动将'1A'x 理解为十六进制值,并将在字符串中搜索它。如果找到,tranwrd 将用破折号替换所有实例。

data want;
    set have;

    character = tranwrd(character, '1A'x, '-');
run;

【讨论】:

  • 谢谢,但不幸的是,不能保证正确的字符会总是是破折号 - 在我迄今为止发现的所有情况下,它恰好是这样,但我更喜欢一个包罗万象的解决方案(或者一个明确的/得到充分支持的声明,没有一个)。
  • 在这种情况下,最好联系 SAS 技术支持:support.sas.com/en/technical-support/contact-sas.html。他们会安排专家在处理这些确切情况方面与您联系并帮助您解决问题。数据库之间的编码问题有时会非常棘手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2023-03-19
  • 2015-07-21
  • 2022-08-11
  • 2014-02-13
  • 2017-10-11
  • 2017-11-10
相关资源
最近更新 更多