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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n但我的前端应用程序检索如下:
\n\n\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n但如果我将其复制并粘贴到文本编辑器中,结果会是:
\n\n\xea\xb7\xb9\xeb\x8b\xa8\xec\xa0\x81\xec\x9c\xbc\xeb\xa1\x9c\nRun 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\nRun 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);\nRun 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}\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n但是,如果我在该表上运行选择,数据会在 SSMS 的输出窗口中显示为乱码。
\n所以看起来 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\')";\nRun Code Online (Sandbox Code Playgroud)\n\n看看这篇文章:
\n\n以下是您可能需要了解的一些事项:
\n\n安装 Debian (Lenny/Squeeze) 的 mssql 支持:
\n\napt-get install php5-sybase \nRun Code Online (Sandbox Code Playgroud)当您收到此错误消息时:\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\nRun 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"\nRun Code Online (Sandbox Code Playgroud)如果需要 unicode 支持,请使用 nchar/nvarchar/ntext 列类型。
| 归档时间: |
|
| 查看次数: |
8686 次 |
| 最近记录: |