SQL Server 2008 R2 中的韩语(和其他 Unicode)字符在查询结果中无法正确显示

Ben*_*Ben 0 sql-server unicode collation cjk sql-server-2008

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

\n\n

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

\n\n

我可以插入这个:

\n\n
\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 SSMS 中看起来像这样:

\n\n
\xc3\xaa\xc2\xb7\xc2\xb9\xc3\xab\xe2\x80\xb9\xc2\xa8\xc3\xac\xc2\xa0\xc3\xac\xc5\x93\xc2\xbc\xc3\xab\xc2\xa1\xc5\x93\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我的前端应用程序检索如下:

\n\n
\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\xe2\x96\xa1\xe2\x96\xa1\xe2\x96\xa1\xe2\x96\xa1\xe2\x96\xa1\n
Run Code Online (Sandbox Code Playgroud)\n\n

但如果我将其复制并粘贴到文本编辑器中,结果会是:

\n\n
\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
\xc3\xaa\xc2\xb7\xc2\xb9\xc3\xab\xe2\x80\xb9\xc2\xa8\xc3\xac\xc2\xa0\xc3\xac\xc5\x93\xc2\xbc\xc3\xab\xc2\xa1\xc5\x93\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

编辑

\n\n

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

\n\n
$con = sqlsrv_connect("(local)", array("Database" => "myDatabase"));\n$SQL = "INSERT INTO TableName (col1,col2) VALUES (N\'\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\',N\'\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\')";\nsqlsrv_query($con,$SQL);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的数据检索的示例:

\n\n
$SQL = "SELECT col1,col2 FROM TableName";\n$rs = sqlsrv_query($con,$SQL);\nwhile($row = sqlsrv_fetch_array($rs)){\n    echo $row["col1"]." ".$row["col2"]."\\n";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这导致 PHP 输出:

\n\n
\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c \xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

And*_*mar 5

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

\n\n
$SQL = "INSERT INTO TableName (col1,col2) VALUES (N\'\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\',N\'\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\')";\n
Run Code Online (Sandbox Code Playgroud)\n\n

看看这篇文章

\n\n
\n\n

以下是您可能需要了解的一些事项:

\n\n
    \n
  1. 安装 Debian (Lenny/Squeeze) 的 mssql 支持:

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

    \n\n

    在 /etc/freetds/freetds.conf 中添加以下两行(最后两行):

    \n\n
    [global]\n;tds version = 4.2\ntds version = 8.0\nclient charset = UTF-8\n
    Run Code Online (Sandbox Code Playgroud)\n\n

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

    \n\n
    ; Specify client character set..\n; If empty or not set the client charset from freetds.comf is used\n; This is only used when compiled with FreeTDS\nmssql.charset = "UTF-8"\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 如果需要 unicode 支持,请使用 nchar/nvarchar/ntext 列类型。

  6. \n
\n