【问题标题】:Korean (and other Unicode) characters in SQL Server 2008 R2 not displaying correctly in query resultsSQL Server 2008 R2 中的韩语(和其他 Unicode)字符在查询结果中未正确显示
【发布时间】:2012-06-12 09:15:57
【问题描述】:

我有一个数据库,它需要保存各种语言和字母的数据。我使用的是默认的拉丁语排序规则,但所有文本字段都是 Unicode 种类(nchar、nvarchar)。

我可以使用我的前端应用程序愉快地从数据库中插入和检索 Unicode 数据,但是如果我使用 SSMS 查看数据,那么我看到的只是乱码!

我可以插入这个:

극단적으로

在 SSMS 中如下所示:

극단ì ìœ¼ë¡œ

但是被我的前端应用程序这样检索:

극단적으로

现在显然数据本身存储正常,但为什么 SSMS 将其显示为乱码?有趣的是,如果我使用 SSMS 直接编辑数据并将其粘贴在上面,然后将其显示为这样(EDIT: 结果是从grid to text 切换结果可以解决我的这部分问题显示文本而不是框。):

□□□□□

但如果我将其复制并粘贴到文本编辑器中,它会显示为:

극단적으로

为了查看这是否只是 SSMS 行为不当(/我配置错误),我使用了 MS Access 并将其链接到我的 SQL Server 数据库,但它显示的乱码与 SQL Server 相同。

此数据库将保存 Web 应用程序的所有静态文本,因此能够轻松查看和编辑数据对我来说很重要,当你只能看到以下内容时不容易做到:

극단ì ìœ¼ë¡œ

任何建议都会很棒,我真的坚持这一点。

编辑

这是我目前在 PHP 中完成的数据插入示例:

$con = sqlsrv_connect("(local)", array("Database" => "myDatabase"));
$SQL = "INSERT INTO TableName (col1,col2) VALUES (N'극단적으로',N'극단적으로')";
sqlsrv_query($con,$SQL);

这是我的数据检索示例:

$SQL = "SELECT col1,col2 FROM TableName";
$rs = sqlsrv_query($con,$SQL);
while($row = sqlsrv_fetch_array($rs)){
    echo $row["col1"]." ".$row["col2"]."\n";
}

这会导致 PHP 输出:

극단적으로 극단적으로

但如果我在该表上运行选择,则数据在 SSMS 的输出窗口中显示为乱码。

【问题讨论】:

  • 也许添加一个示例,说明您如何在客户端中存储和检索数据?
  • @Andomar 只是在 php 中使用 SQL 查询,但直接在 SSMS 中运行查询具有相同的效果,除了在 SELECT 上,您会在 SSMS 中得到乱码而在 php 中得到正确的输出。我不确定它是否会有所帮助,但我会在几秒钟内添加一个示例。
  • 如果在编解码过程中出现同样的错误,两者可以抵消。但 SQL Server 只会看到编码错误的版本。
  • @Andomar 那么我将如何解决这个问题?

标签: sql-server sql-server-2008 unicode collation cjk


【解决方案1】:

所以看起来你在 PHP 文件中有一个字符串文字:

$SQL = "INSERT INTO TableName (col1,col2) VALUES (N'극단적으로',N'극단적으로')";

看看this post:


您可能需要了解以下几点:

  1. 为 Debian 安装 mssql 支持(Lenny/Squeeze):

    apt-get install php5-sybase 
    
  2. 当您收到此错误消息时: “无法使用 DB-Library(如 ISQL)或 ODBC 3.7 或更早版本将纯 Unicode 排序规则中的 Unicode 数据或 ntext 数据发送到客户端。”

    在 /etc/freetds/freetds.conf 添加这两行(最后两行):

    [global]
    ;tds version = 4.2
    tds version = 8.0
    client charset = UTF-8
    

    您也可以在 php.ini 中编辑“charset”(但如果您之前在 freetds.conf 中做过,则不需要):

    ; Specify client character set..
    ; If empty or not set the client charset from freetds.comf is used
    ; This is only used when compiled with FreeTDS
    mssql.charset = "UTF-8"
    
  3. 如果您需要 unicode 支持,请使用 nchar/nvarchar/ntext 列类型。

【讨论】:

  • 对不起,我应该说我使用的是 Windows 7 机器
  • @Ben: freetds.conf 应该仍然在某个地方,要么在 C:\ 中,要么在 FREETDS 环境变量的目录中。
  • 我找不到 feetds.conf 所以我只是编辑了 php.ini 文件,但不幸的是我没有做出任何改变
  • @Ben:好的,看起来你正在使用Microsoft driver for PHP。也许仔细检查您的文件存储的编码?在记事本中打开 .php 文件时,韩语的外观如何?
  • 没错,我正在使用 Microsoft 的 PHP 驱动程序。文件编码设置为 UTF-8,当在记事本中打开时,它会将韩文字符显示为有趣的小方框。
【解决方案2】:

我知道这是一个老问题,但我看不出问题的解决方案,我刚刚开始在 SSMS 中遇到同样的问题。我不认为问题出在 PHP 编码上,基于关于如果结果被视为文本而不是网格的编辑,那么问题就解决了(我遇到了同样的行为)。我认为问题实际上在于 SSMS 和网格输出的编码,因为即使 SSMS 在以文本形式查看时也可以正确显示韩文字符。

我已通过将字体更改为“Arial Unicode MS”来解决 SSMS 中的问题。但是我注意到其他应用程序也出现了该问题,尤其是 Notepad++ 和 Notepad 等文本编辑器。

以下帖子似乎包含对该问题的更永久修复(但是我在网络计算机上没有足够的权限来验证它)。

sql server management console doesn't work with multi-byte characters

注意:过去 6 周我一直在 SQL Server 中使用韩语/韩文数据,但没有遇到此问题。它只是今天才发生,我有 Windows 更新,但没有其他原因导致行为改变。我以前也使用过这个查看/查询过的数据,在尚未更新且绝对编码为 NVARCHAR 的表上没有问题。我的韩国同事仍然可以在 SSMS 的 Grid 输出中正确查看数据。

我希望这可以帮助任何偶然发现这个问题的人。

【讨论】:

    【解决方案3】:

    극단ì ìœ¼ë¡œ 是您在 Windows Latin 1 中显示的 극단적으로。所以我猜 SSMS 未配置为显示 UTF-8...

    【讨论】:

    • SQL Server 无法存储 UTF-8。 nvarchar 列是 UCS-2,char 列是单字节编码。因此,驱动程序必须先将 UTF-8 转换为 UCS-2,然后才能将其传输到 SQL Server。
    • 我不做 MS SQL,所以我相信你。可以肯定的是,극단ì 으로 是 UTF-8 中的 극단적으로,显示为 Windows Latin 1。所以存储的字节是一系列 UTF-8 代码点,被误解了。
    • @Andomar 所以不知何故我需要告诉 SSMS 停止尝试将这些列显示为 Latin1 .....
    • 类似的东西是的。另请参阅@Andomar 关于 SQL Server 中 UTF8 和 UCS2 的评论。您可能需要转换字符串。
    • @Ben:SSMS 和 SQL Server 仅支持 UCS-2。您必须指示您的驱动程序将字符串作为 UCS-2(或 UTF-16,大致兼容)传输。
    猜你喜欢
    • 2017-02-14
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多