关于SQL server 内容乱码问题的资料收集
架构:VC++的ATL Server进行开发;
页面:web页面是UTF-8编码,CodePage=65001;
应用服务器程序:编译好的dll是Unicode编码;
操作系统:中文Windows 2003 Server;
数据库联接方式:OLEDB
数据库:中文MSSQL Sever2005,显示Codepage=936,
字段都是支持Unicode的nchar,nvarcha,nText;
SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI', 'CodePage')
936
________________________________________________
发现从Web页面提交的数据到数据后查询总是乱码,经过检查,发现保存的数据直接就是是UTF-8编码,其CodePage=65001,而数据默认显示支持的Unicode语言版本Codepage=936(即是简体中文),所以数据查询的就是乱码,想过两种方案:
1,怀疑是数据时UTF-8编码,而SQLServer是UCS-2 版本,相通过UTF-8-〉UCS-2转换,发现还是行不通,仍然乱码,此路不通;
2,搜索了网络发现并没有现成的例子,经过测试中文系统使用Web页面为GB2312编码提交的数据到数据很正常,基于Windows2003是支持Unicode(UCS-2),排除操作系统的问题,这个过程经过分析可以这么理解:936(Web页面编码GB2312)-〉Unicode(应用服务器端)-〉Unicode(数据库OLEDB传输)-〉UCS-2(数据库)-〉自动转化为936(Unicode简体中文语言版本),而使用UTF-8的Web页面这个过程就是:65001(Web页面编码UTF-8)-〉Unicode(应用服务器端)-〉Unicode(数据库OLEDB传输)-〉UCS-2(数据库)-〉自动转化为936(Unicode简体中文语言版本),所以最后的使用数据分析查询器看到的就是乱码,最后确定的方案就是两种手段:一是更改数据查询分析器的Codepage为65001,很显然当前的SQLServer没有这个功能(没找到?知道的告诉我);二是将前端的UTF-8转为GB2312编码,很显然这个最后成功了,这个过程程序还是保留了所有的多语言的特性,一位UTF-8-〉GB2312,这个过程是无损的,因为是UTF-8->Unicode->GB2312.
总结:
1,MSSQL Server不支持UTF-8(Codepage=65001)直接显示,数据库查询的显示数据使用默认的Codepage,如简体中文版就是936,繁体中文是950,韩文949等,因此从使用的Web页面UTF-8提交的数据自动转换为所用的Codepage显示,因此就是乱码,这个有待MS SQL Server进一步发展,因为现在Oracle和MySQL是可以支持直接UTF-8存储显示,国际化时请先将数据由UTF-8编码转化为MSSQL数据库默认的编码,读写出来这个过程着相反进行转化,这个过程看起来会因为转化过程影响处理速度(抉择于国际化);
2,ASP/ASPX/JSP/PHP使用MSSQL Server编程支持UTF-8都会面临这样的问题,可以看看MSDN有关这个方面的解释
http://support.microsoft.com/kb/232580/zh-cn
演示网址:http://www.bomege.comhttp://www.bomege.com 留言部分
概要
某些应用程序 (尤其是基于 Web) 必须处理是用 UTF-8 编码方法编码 Unicode 数据。 SQL Server 7.0 和 SQL Server 2000 使用 Unicode 编码 (UCS-2) 不同和不识别 UTF-8 作为有效字符数据。 本文讨论一些选项用于处理与此情况。
更多信息
可以以许多不同方式进行编码 Unicode 数据。 UCS-2 和 UTF-8 是两种常见方法来存储表示 Unicode 字符位模式。 作为 UCS-2 MicrosoftWindowsNT、 SQLServer、 Java、 COM, 和 SQLServerODBC 驱动程序和 OLEDB 提供所有内部表示 Unicode 数据。
用于使用 SQL Server 7.0 或 SQL Server 2000 作为后端服务器对于应用程序, 发送和接收 Unicode 数据是以 UTF-8 编码选项包括: 1. 如果应用程序使用 Active Server Pages (ASP) 并且您使用 Internet Information Server (IIS) 5.0 和 Microsoft Windows 2000, " < % Session.Codepage=65001 % > " 添加到您的服务器端 ASP 脚本。 这指示 IIS 以转换所有动态生成字符串 (Response.Write) 从 UCS-2 以 UTF-8 它们发送到客户端之前自动示例:。
如果您不想启用会话, 也可以使用服务器端指令 " < > % @ CodePage " = 65001 %。
自动从客户端发送到服务器通过 GET 或 POST 任何 UTF-8 数据还转换为 UCS-2。 Session.Codepage 属性是推荐方法以处理 Web 应用程序中 UTF-8 数据。 IIS 4.0 和 Windows NT 4.0 上没有此 Codepage 设置。 有关其他信息, 请参阅下列 Microsoft 知识库文章:
254313 (http://support.microsoft.com/kb/254313/EN-US/) 错误消息: ActiveServerPages 错误 ASP 0203 ' ' 无效代码
2. 根据应用程序中翻译与 UCS-2 或 UTF-8。 对于该类型转换的示例代码是在 Unicode 联合会的站点位于:
http://www.unicode.org/Public/PROGRAMS/CVTUTF (http://www.unicode.org/Public/PROGRAMS/CVTUTF)
Internet Request For Comments 文档 RFC2279 中可以找到要转换为 UTF-8 UCS-2 算法的高级说明。
在 WindowsNT 或 Windows 2000, 您可能使用 Win 32 函数 MultiByteToWideChar 和 WideCharToMultiByte 来通过传递常量 CP_UTF8 UTF-8 转换与 UCS-2 作为第一个参数对函数 (65001)。
3. 修改应用程序以使用 UCS-2 代替 UTF-8 编码。
4. 使用 BINARY / VARBINARY / IMAGE 列在服务器上存储实际 UTF-8 数据。 SQLServer 上存储 UTF-8 数据意味着您可不使用 SQLServer 来排序或查找数据一样有效字符数据的这些值范围。 类型的列包含 UTF-8 数据不会返回预期结果包括 " ORDERBY ", 更上 - 比操作 < > 并小于 "-" 比 " 比较和内置 SQLServer 字符串处理函数如 SUBSTRING() "。
但是, 相等比较, 工作只要等效字符串比较是在字节级别。 注意: 您如果 UTF-8 数据存储在 SQLServer 应该不使用字符列 (CHAR/NCHAR / VARCHAR 和等等)。 UTF-8 是无效字符数据到 SQLServer, 和通过非字符数据存储在字符列可能遇到问题如以下 Microsoft 知识库文章中讨论问题:
155723 (http://support.microsoft.com/kb/155723/EN-US/) INF: SQLServer 截断的 DBCS 字符串
234748 (http://support.microsoft.com/kb/234748/EN-US/) PRB: SQLServerODBC 驱动程序将语言事件转换为 Unicode
如果考虑此选项, 请记住您将需要执行从 UTF-8 转换为 UCS-2 如 ODBC、 OLEDB、 COM, 此应用程序中如果曾经需要访问 UTF-8 数据从 Web 浏览器 (例如, 从非基于 Web 的 ODBC 应用程序) 以外任何应用程序存储在 SQLServer Win32API 调用、 VB 和 C 运行时字符串处理函数不能使用 UTF-8 数据。 这将是翻译负担移到其他应用程序。
5. 如果要求不包含需要存储数据的语言是无法满足由单个代码页, 组合可能不需要使用 Unicode。
Unicode 支持引入到 SQLServer 以 SQL Server 7.0。 因为 SQL Server 6.5 不支持的 Unicode 数据, 存储仅选项对于 SQL Server 6.5 列于步骤 4 和步骤 5。
可以查一下类似下面的语句,第一个参数是安装数据库时所选的字符集:
SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage')
如果返回值不是936,说明不支持GBK。
sqlserver里带N的类型,表示是使用utf-8存储的。
sqlserver7/2k采用ucs-2而没有采用utf-8是有它自己的小99的。不知道2005版如何。
曾想过通过升级数据库的方式解决,我查过资料sql server 2005,依然是ucs-2。
"sqlserver里带N的类型,表示是使用utf-8存储的。" 这句话不太对,带N的类型是指nchar,nvarchar,ntext这些吧,他们代表使用UNICODE存储,但是内部的UNICODE编码是UCS-2,据我所知。
可以查一下类似下面的语句,第一个参数是安装数据库时所选的字符集:
SELECT COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage')
如果返回值不是936,说明不支持GBK。
sqlserver里带N的类型,表示是使用utf-8存储的。
sqlserver7/2k采用ucs-2而没有采用utf-8是有它自己的小99的。不知道2005版如何。
你可以贴一些乱码的繁体或者韩日文来么,偶在自己的系统上试试看。
谢谢回复,从GOOGLE 搜来的日文,韩文,你拿来试试,理论上讲用varchar()是不支持UNICODE的,SQL SERVER 支持UNICODE 就是通过nchar, nvarchar,ntext这些数据类型,而不像ORACLE既有unicode编码的数据类型,同时还有unicode编码的数据库,在安装的时候就指定了。
日文:
URLが変更となりました。 2006年4月1日をもちまして、豊田通商株式会社と株式会社トーメンは合併し、URLはhttp://www.toyota-tsusho.comに変更になりました。 豊田通商株式会社のホームページをご覧になられる方は下記よりご覧ください
韩文:我机子上字库没有安装,看到的乱码,拷贝不过来。
繁体中文:
如果利用地表陸地的1%的面積來截取太陽能,再假設太陽能的轉換率是10%的話,其所產生的瓦數,將是相等於我們目前全世界能源消耗量的兩倍。」上述科學研究的精算結果,明確指出發展永續能源的重要性與高度應用價值... >> 全文
你可以试一下。
你可以贴一些乱码的繁体或者韩日文来么,偶在自己的系统上试试看。
关于SQL server 内容乱码问题的资料收集相关推荐
- python学习内容大全_Python学习资料收集
Python 实用资料收集 一 . Python 常用链接和基本工具 1. Online Python Tutor :首先,隆重推荐这个牛逼的网站,这是我看到的最让人爱不 释手的学习 Python 的 ...
- SQL Server插入或修改数据是中文乱码的问题
SQL Server中乱码解决方案: 在Sql Server2005英文版中,如果未对Varchar类型的字段进行设置,那么很多朋友会发现向数据库中插入记录时,如果对应的varchar类型字段 的值为 ...
- sql server死锁_如何使用扩展事件和SQL Server代理自动执行SQL Server死锁收集过程
sql server死锁 介绍 (Introduction) This article is the last one of a series in which we discussed how to ...
- sql错误索引中丢失_收集,汇总和分析丢失SQL Server索引统计信息
sql错误索引中丢失 描述 (Description) Indexing is key to efficient query execution. Determining what indexes a ...
- SQL Server 2008 :安装
有关SQL Server 2008的安装相关资料,我整理如下 1. 相关的版本 2. 升级还是迁移 3. 安装过程 4. 安装中心 5. 无人值守安装
- SQL Server监控全解析
SQL Server监控全解析 在SQL Server的日常管理中,让SQL Server高效运行,且性能良好,是DBA需要做的事.DBA需要了解数据库的日常运行情况,对性能进行分析和调优,需要对线上 ...
- Microsoft SQL Server Reporting Services 初探
1.安装 SQL Server Reporting Services (SQLServerReportingServices.exe) 下载: Microsoft SQL Server 2017 Re ...
- transact sql mysql_MySQL与Transact SQL(MS SQL Server)的SQL语句区别点滴(C++)
最近在写一个数据访问层,要求可以使用MySQL和MS SQL Server.html 烦劳今后开始,MySQL与MS SQL Server的大量不一致让人烦不胜烦,为了使其余人再也不犯本身工做过程当中 ...
- SQL Server执行计划 解析
当需要分析某个查询的效能时,最好的方式之一查看这个查询的执行计划.执行计划描述SQL Server查询优化器如何实际运行(或者将会如何运行)一个特定的查询. 查看查询的执行计划有几种不同的方式.它们包 ...
最新文章
- SCDPM2012功能测试(4)—配置通知
- zookeeper学习笔记2
- .Net上下文Context 学习记录
- git 回退版本并强制提交
- 如何实现android和服务器长连接呢?推送消息的原理
- 基于T4模板的文档生成
- 信号量与线程互斥锁的区别
- 【正十七边形可尺规作图原理】
- 智慧数字门店管理系统、PAD、门店系统、收银开单、预约服务、会员管理、账单管理、数据统计、商品、库存、美容美体、美甲美睫、医疗美容、美发造型、医疗诊所、中医理疗、宠物服务、美业、经营业务、售卡、交班
- 华为ax3怎么接光纤sc接口_光纤收发器接口类型、连接、指示灯说明及故障症断...
- 大数据分析中常用的方法有哪些
- .git文件过大,如何清理
- android 阅读器字体,为 Android 换上任意喜欢的字体,你可以试试这个 Magisk 模块...
- struct termios
- 牛顿迭代法求一元三次方程c语言,C++一元三次方程求解算法 - 小众知识
- (八) 爬虫教程 |Scrapy框架的使用
- vmware虚拟服务器数据备份,爱数VMware虚拟化平台备份恢复方案.pdf
- 实现调用阿里云API第一章——API请求与认证
- 【问题记录】js 更改数组中某字段名
- Python问题解决7:爬虫报错SyntaxError: Non-UTF-8 code starting with ‘\xbb‘ in file