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了,可以方便地测试运行小型项目:既然是轻量级数据库,它抛弃了庞大的身躯,功能上当然也会受到局限,其中之一 ...
随机推荐
- [Luogu2444][POI2000]病毒
Luogu sol 如果存在一个合法的无限长的串,那势必说明在\(AC\)自动机上存在一个合法的环.由此转化为判环,只要判断搜到的点是否已经在搜索栈中即可. code #include<cstd ...
- 【learning】一种奇妙的网络流建模方式
吐槽 好吧这个是真的很妙qwq用来解方程组的网络流嗯不能更清真 正题 首先是大概描述 当一个方程组中所有的方程相加之后可以把所有的变量都消掉(也就是所有变量都出现一正一负可以抵消掉),我们会发现这个其 ...
- react ( 二 )
ref属性 当我们在 react组件中要访问真实的DOM元素时,你可能需要用到ref属性,ref接收一个函数作为属性值,函数接收一个参数,这个参数就是真实的DOM元素.真实的DOM元素渲染到页面上之后 ...
- react-native简单demo:实现加载豆瓣电影列表
https://github.com/axel10/react-native-douban' 相关随笔: react-native 开发环境搭建 http://www.cnblogs.com/axel ...
- css学习の第二弹—文字格式化排版
1.css格式化排版 >>字体设计: etc:body{font-family:"Microsoft Yahei";} >>字号,颜色: etc:body{ ...
- Angular4--提速--提升Angular项目的首页打开速度(包含微信登录优化)
Angular项目的首页打开速度很慢,有时候会有几秒的加载时间.如果在手机端访问的话,怕是要等待十多秒,这对用户体验很差.下面参考http://www.cnblogs.com/feiyu159/p/8 ...
- 免费后台管理UI界面、html源码推荐
一个好的UI应该满足的条件应该达到如下几个: 1.美观.大方.简洁 2.兼容IE8.不考虑兼容IE6/IE7,因为现在还有很多公司在使用Win7系统,系统内置了IE8 3.能通过选项卡打开多个页面,不 ...
- AJAX学习笔记2:XHR实现跨域资源共享(CORS)以及和JSONP的对比----转载
1 前言: 首先对参考文章作者表示感谢,你们的经验总结给我们这些新手提供了太多资源.本文致力于解决AJAX的CORS问题,我在逻辑上进行了梳理:首先,系统的总结了CORS问题的起源-同源策略:其次,介 ...
- 原生js移动端滑动事件
移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...
- 【django之博客系统开发】
一.项目简介 使用django开发一套博客系统,参考博客园. 需求如下: 项目结构: 二.全部代码 from django.db import models # Create your models ...