sqlserver之排序规则和ETL不支持sqlserverdatetime2的问题
sqlserver的排序规则大概分为Windows 排序规则和 SQL Server 排序规则。数据在安装的时候,默认不设置会默认为SQL_Latin1_General_CP1_CI_AI。数据库在创建的时候,如果不设定会使用数据默认的排序规则,此外,还可以对表中的列设定排序规则。
这里只是记录一下最近遇到这类问题时的一些注意事项。
首先SQL_Latin1_General_CP1_CI_AI对应的1252,而Chinese_PRC_CI_AS对应gbk的936。如果要正确的保存中文,则需要在建库的时候,或者建表的时候,对库或者列时,设定个排序规则。一般默认应该是列服从数据库,数据库服从安装时的默认值。
接下来是本人遇到了问题以及解决的过程,记录一下,加深印象:
本人碰到的问题是使用ETL把数据从oracle抽取到sqlserver中,oracle的编码方式是UTF8。sqlserver的默认排序规则是SQL_Latin1_General_CP1_CI_AI。创建库的时候没有注意设置这个排序规则,使用了默认,导致sqlserver在无法识别时,使用??来代替了原来的中文内容。后来发现了问题,由于修改默认的排序规则较为麻烦,直接修改库的排序规则。之后ok了。(注明:一开始一直把问题集中在ETL的转换上,实际上,ETL在抽取数据之后只不是乱码,则插入一般是没有问题的)
后来把这个成功导入数据的sqlserver A备份到其它sqlserver B。检查了目标库sqlserver B的默认排序规则和数据库的排序规则都是Chinese_PRC_CI_AS,都没有问题,不管使用ssis的平面文件,还是数据库源导入数据到sqlserverB都不行。始终报诸如“由于为列“UUID”指定了多个代码页(936 和 1252),无法处理此列。”这样的问题。最后把问题定位到列的排序方式。发现原来是在sqlserverB的列都SQL_Latin1_General_CP1_CI_AI。起因可能是起初导数据或者ETL帮助生成表的时候,导致这个列排序为SQL_Latin1_General_CP1_CI_AI。删除表,通过ssis数据源导入数据到sqlserverB,自动创建表(注意,有些时候还是需要手动修改一个生成表的sql)。此时的列的排序方式正确,只要sqlserver到sqlserver导数据不报错,我想应该导入的也是正确的中文。经检验,中文正常,我想通过ETL肯定也会正常。这里不在检验。
结论:
了解sqlserver的排序规则的功能和意义,以及分类,主要是中文和非中文的问题。选择正常的排序规则,相应的文字才会正确。
有三个级别的排序规则的设定。安装数据库的时候,创建数据库的时候,创建表的时候(列)。
此外另一个问题:
ETL在插入时间数据到sqlserver时,有时会遇到“Only dates between January 1, 1753 and December 31, 9999 are accepted.”的问题,但是sqlserver中的目标列已经设置成了datetime2(7)了。是可以容纳这个范围之外的数据,datetime确实只允许在这个范围。因此ETL中相关的功能没有对新版的sqlserver类型的支持。
解决办法:
sqlserver在向时间字段插入数据时,如果源字段是varchar型,则会自动转换,此时,只需要把源端的时间转换为比较标准的时间字符串即(sqlserver可以自动识别的),比如oracle就可以使用to_char(xx,'yyyy-MM-dd HH24:mi:ss')。即可以解决问题。但是要注意,目标字段的类型要使用datetime2(7)。
相关查询语句:
如下来自http://blog.csdn.net/delphigbg/article/details/12744807的对排序规则的介绍。原文还有对这三种情况的修改方法。
oracle查询编码方式:
select userenv('language') from dual;
Select * From Nls_Database_Parameters
sqlserver查询语句:
系统默认排序规则: SELECT SERVERPROPERTY(N'Collation')
数据库排序规则: SELECT DATABASEPROPERTYEX('DB_JS_QZK', 'Collation')。
什么是排序规则呢? 排序规则根据特定语言和区域设置标准指定对字符串数据进行排序和比较的规则。SQL Server 支持在单个数据库中存储具有不同排序规则的对象。MSDN解释:在 Microsoft SQL Server 中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则
当 Transact-SQL 语句在具有不同排序规则设置的不同数据库上下文中运行时,其运行结果可能会不同。如果可能,请为您的组织使用标准化排序规则。这样就不必显式指定每个字符或 Unicode 表达式中的排序规则。如果必须使用具有不同排序规则和代码页设置的对象,请对查询进行编码,以考虑排序规则的优先顺序规则。
排序规则指定了表示每个字符的位模式。它还指定了用于排序和比较字符的规则。排序规则的特征是区分语言、区分大小写、区分重音、区分假名以及区分全半角。如下所示:
Chinese_PRC_CI_AS 前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则,CI表示不区分大小写,AS表示区分重音。
sqlserver之排序规则和ETL不支持sqlserverdatetime2的问题的更多相关文章
- SQLServer的排序规则(字符集编码)
SQLServer的排序规则(字符集编码) 一.总结 1.SQLServer中的排序规则就是其他关系型数据库里所说的字符集编码: 2.SQLServer中的排序规则可以在3处设置,如下: 服务器级别( ...
- From 百度知道 SQLSERVER 字符集排序规则简单说明
https://zhidao.baidu.com/question/390314825002277485.html 学习一下, 以后说不定用得到. collate Latin1_General_CS_ ...
- SqlServer nvarchar中的中文字符匹配,更改SqlServer实例和数据库排序规则的办法
我们都知道在SqlServer中的nvarchar类型可以完美的存储诸如中文这种unicode字符,但是我们会发现有时候查询语句去查询nvarchar列的时候查不出来. 为什么nvarchar类型有时 ...
- 修改Sqlserver实例默认排序规则
1.将sqlserver安装盘加载到虚拟光驱,这里加载到F:盘跟目录 2.cmd进入命令 3.输入命令: F:/Setup /QUIET /ACTION=REBUILDDATABASE /INSTAN ...
- SQLSERVER 修改数据实例的排序规则
SQL Server服务器修改排序规则的方法 操作及验证步骤: 1 登录数据库后,查看当前安装数据库默认排序规则的两种方式 方式一.使用SQL Server 2014 Management Studi ...
- SQL Server 与MySQL中排序规则与字符集相关知识的一点总结
字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...
- 数据库排序规则的冲突(理解collate Chinese_PRC_CI_AS)
之前碰到了数据库排序规则冲突问题,即百度或者 Google 的老话题: “ 无法解决 equal to 操作中‘ sql_latin1_general_cp1_ci_as ’和‘ chinese_pr ...
- MS SQL 排序规则总结
排序规则术语 什么是排序规则呢? 排序规则是根据特定语言和区域设置标准指定对字符串数据进行排序和比较的规则.SQL Server 支持在单个数据库中存储具有不同排序规则的对象.MSDN解 ...
- [转]LocalDB数据库修改排序规则,修复汉字变问号
VS中新增的轻量级数据库LocalDB,有个这个,开发人员就不必再安装庞大的SQL server了,可以方便地测试运行小型项目:既然是轻量级数据库,它抛弃了庞大的身躯,功能上当然也会受到局限,其中之一 ...
随机推荐
- 第四篇:Web框架 - Django
前言 Django是一个开放源代码的Web应用框架,由Python写成.它和J2EE一样,采用了MVC的软件设计模式,即模型M,视图V和控制器C. 本文将讲解DJango框架,并从实际应用的角度讲解一 ...
- 关于transform的3D变形函数
继续transform的3D用法: translate3d(x,y,z)定义3D转换 transformX(x)只用x轴的值进行转换: transformY(y)只用y轴的值进行转换: transfo ...
- Ubantu16.04进行Android 8.0源码编译
参考这篇博客 经过测试,8.0源码下载及编译之后,占用100多G的硬盘空间,尽量给ubantu系统多留一些硬盘空间,如果后续需要在编译好的源码上进行开发,需要预留更多的控件,为了防止后续出现文件权限问 ...
- ssm整合快速入门程序(一)
整合基础说明 spring 是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Jav ...
- [BZOJ4736]温暖会指引我们前行
BZOJ(BZOJ上的是什么鬼...) UOJ 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低. 小 ...
- mysql的conv的用法
这次的ctf比赛用到这个函数,这里记录一下 题目禁了ascii , ord 那就使用conv 这个函数是用来将字符转换进制的,例如将a转成ASCII码(换个说法就是将16进制的a换成10进制) 那就直 ...
- 论文笔记(6):Weakly-and Semi-Supervised Learning of a Deep Convolutional Network for Semantic Image Segmentation
这篇文章的主要贡献点在于: 1.实验证明仅仅利用图像整体的弱标签很难训练出很好的分割模型: 2.可以利用bounding box来进行训练,并且得到了较好的结果,这样可以代替用pixel-level训 ...
- Delphi关于TAdvStringGrid控件颜色的设置
FixedFont-Color 标题行和列字体的颜色 Font-color 单元格字体的颜色Visual-color 整个表格的背景色填充
- Android 音视频开发时可用的测试链接整理
一. 国内免费可用的STUN服务器 1 | stun.xten.com | 3478 2 | stun.voipbuster.com | 3478 3 | stun.voxgratia.org | 3 ...
- 爬虫-request以及beautisoup模块笔记
requests模块 pip3 install requests res = requests.get('') res.text res.cookies.get_dict() res.content ...