以老挝语从 SQL Server 2014 导出数据 [Encoding/Collation 问题]
Exporting data from SQL Server 2014 in Lao Language [Encoding/Collation issue]
我得到了一个在老挝使用的数据库的非常大的备份 (.BAK),我在 SQL Server 2014 Express(本地)服务器上恢复了它。这是一个有很多列的数据库,其中包含老挝语文本。当使用数据库的人通过客户端应用程序(某种泰语会计程序)访问它时,当他们将显示字体设置为 Saysettha(一种带有老挝字符的 Unicode 字体)时,他们可以看到所有正确显示的老挝数据。
但是,我正在尝试从 SSMS 导出 table 中的数据(通过简单的文本或 csv 文件,因为导出过程需要简单且重复 table)和数据永远不会正确显示。即使我在 SSMS 中执行 table 查询时也不行。
我知道这可能是 encoding/collation 的问题。这些列存储在 VARCHAR
列中。我试过将它们转换为 NVARCHAR
列,但这并没有解决问题。我也试过将列排序为老挝排序规则(恢复备份后服务器排序规则设置为Thai_CI_AS);
我尝试将输出 table 保存为具有不同编码的 CSV 和 TXT 文件,但是当我打开它们时,例如Notepad++ 我看到了同样的错误字符。
不幸的是,我没有文本应该是什么样子的样本,因为我的笔记本电脑上没有 运行 客户端软件。
理想情况下,我能够以 UTF-8 编码导出列。
我的理解是,老挝语文本通常以 UTF-8 编码、UTF-16 编码或 Code page 1133 编码存储。
当查看应用程序使用与存储数据时相同的编码时,它看起来没问题。
不幸的是,有时查看应用程序没有被告知使用了何种编码,因此它 "helpfully" 尝试 guess,但有时它猜错了。
通常错误的猜测对于看显示器的人来说是显而易见的——这些字母甚至不是来自正确的语言。
更糟糕的是,当您告诉应用程序从数据库中导出数据,而不是简单地导出文本的原始字节时,应用程序可能 "helpfully" 将数据转换为不同的编码。
如果应用程序碰巧知道数据库中数据的实际编码,那么在导出时转换为 UTF-16 或 UTF-8 效果很好;否则导出的数据通常会损坏且无法使用。
有时最难解决的问题是系统实际工作正常,但我(错误地)认为有问题。有时发生这种情况是因为我用来查看问题的工具存在缺陷。
如果您在 Notepad++ 中看到的大部分是老挝语字符,或者您可以更改 Notepad++ 中的编码直到看到大部分是老挝语字符,那么我怀疑您的文本或 csv 文件中的数据以及 Notepad++ guessed or that you set with Encoding -> Encode 的编码可能是正确的。
有没有什么方法可以让你看看数据是否真的被数据库正确地存储、处理、导出等,并且被客户端应用程序正确地显示,但是在记事本或 SSMS 中出现渲染故障是否错误地处理了一些重音符号?
- "Data Formats for Bulk Import or Bulk Export (SQL Server)" 似乎建议使用字符格式(“-c”)将数据导出到文本文件,即使是 Unicode 数据,而不是本机格式(“-n”), Unicode 本机格式(“-N”)或 Unicode 字符格式(“-w”)。
- How to Export utf-8 data from sql server 2008 to excel
- Export query result to csv in UTF-8
- "SQL Server: Export table data to UTF-8 text file"
- "How to import/export MySQL database with exact character set"
- Export import of asian languages data in sql server
- "Microsoft Drivers for PHP for SQL Server: How to: Send and Retrieve UTF-8 Data Using Built-In UTF-8 Support"
- "For Unicode data, the Collation has no bearing on physical storage." -- UTF-8 Support, SQL Server 2012 and the UTF8String UDT
我得到了一个在老挝使用的数据库的非常大的备份 (.BAK),我在 SQL Server 2014 Express(本地)服务器上恢复了它。这是一个有很多列的数据库,其中包含老挝语文本。当使用数据库的人通过客户端应用程序(某种泰语会计程序)访问它时,当他们将显示字体设置为 Saysettha(一种带有老挝字符的 Unicode 字体)时,他们可以看到所有正确显示的老挝数据。
但是,我正在尝试从 SSMS 导出 table 中的数据(通过简单的文本或 csv 文件,因为导出过程需要简单且重复 table)和数据永远不会正确显示。即使我在 SSMS 中执行 table 查询时也不行。
我知道这可能是 encoding/collation 的问题。这些列存储在 VARCHAR
列中。我试过将它们转换为 NVARCHAR
列,但这并没有解决问题。我也试过将列排序为老挝排序规则(恢复备份后服务器排序规则设置为Thai_CI_AS);
我尝试将输出 table 保存为具有不同编码的 CSV 和 TXT 文件,但是当我打开它们时,例如Notepad++ 我看到了同样的错误字符。
不幸的是,我没有文本应该是什么样子的样本,因为我的笔记本电脑上没有 运行 客户端软件。
理想情况下,我能够以 UTF-8 编码导出列。
我的理解是,老挝语文本通常以 UTF-8 编码、UTF-16 编码或 Code page 1133 编码存储。
当查看应用程序使用与存储数据时相同的编码时,它看起来没问题。 不幸的是,有时查看应用程序没有被告知使用了何种编码,因此它 "helpfully" 尝试 guess,但有时它猜错了。 通常错误的猜测对于看显示器的人来说是显而易见的——这些字母甚至不是来自正确的语言。
更糟糕的是,当您告诉应用程序从数据库中导出数据,而不是简单地导出文本的原始字节时,应用程序可能 "helpfully" 将数据转换为不同的编码。 如果应用程序碰巧知道数据库中数据的实际编码,那么在导出时转换为 UTF-16 或 UTF-8 效果很好;否则导出的数据通常会损坏且无法使用。
有时最难解决的问题是系统实际工作正常,但我(错误地)认为有问题。有时发生这种情况是因为我用来查看问题的工具存在缺陷。 如果您在 Notepad++ 中看到的大部分是老挝语字符,或者您可以更改 Notepad++ 中的编码直到看到大部分是老挝语字符,那么我怀疑您的文本或 csv 文件中的数据以及 Notepad++ guessed or that you set with Encoding -> Encode 的编码可能是正确的。
有没有什么方法可以让你看看数据是否真的被数据库正确地存储、处理、导出等,并且被客户端应用程序正确地显示,但是在记事本或 SSMS 中出现渲染故障是否错误地处理了一些重音符号?
- "Data Formats for Bulk Import or Bulk Export (SQL Server)" 似乎建议使用字符格式(“-c”)将数据导出到文本文件,即使是 Unicode 数据,而不是本机格式(“-n”), Unicode 本机格式(“-N”)或 Unicode 字符格式(“-w”)。
- How to Export utf-8 data from sql server 2008 to excel
- Export query result to csv in UTF-8
- "SQL Server: Export table data to UTF-8 text file"
- "How to import/export MySQL database with exact character set"
- Export import of asian languages data in sql server
- "Microsoft Drivers for PHP for SQL Server: How to: Send and Retrieve UTF-8 Data Using Built-In UTF-8 Support"
- "For Unicode data, the Collation has no bearing on physical storage." -- UTF-8 Support, SQL Server 2012 and the UTF8String UDT