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了,可以方便地测试运行小型项目:既然是轻量级数据库,它抛弃了庞大的身躯,功能上当然也会受到局限,其中之一 ...
随机推荐
- [BZOJ3751] [NOIP2014] 解方程 (数学)
Description 已知多项式方程:$a_0+a_1*x+a_2*x^2+...+a_n*x^n=0$ 求这个方程在[1,m]内的整数解(n和m均为正整数). Input 第一行包含2个整数n.m ...
- [CodeVS2370] 小机房的树 (LCA, 树链剖分, LCT)
Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花 ...
- Java 多线程异步处理demo
java中实现多线程 1)继承Thread,重写里面的run方法 2)实现runnable接口通过源码发现:第一种方法说是继承Tread然后重写run方法,通过查看run方法的源码,发现run方法里面 ...
- python数据类型——字符串类型
字符串(string) 字符串,就是字符连成一串,是由字符组成的序列.字符串有编码问题,在之前我已经讲过.本节主要讲字符串的使用. 创建字符串,不用多说: a='123abcd' b='diamond ...
- up61博客模版版本v1.0.0
经过两天的努力 终于把博客模板框架写出来了. 表示写模板累死了,很久没有写样式了,还是那么难搞.没有PHP写函数爽. 不管怎么样 第一版出来了.以下是部分截图.预览 当然在示例部署到项目上的时候 ,部 ...
- c# ffmpeg视频转换【转载】
c# ffmpeg视频转换 什么是ffmpeg,它有什么作用呢,怎么可以使用它呢,带着问题去找答案吧!先参考百度百科把,我觉得它很强大无奇不有,为了方便大家我就把链接提供了! http://baik ...
- NancyFX 第九章 Responses(响应对象)
和内容协商最最为紧密的当属Nancy的Response对象. 在本书的第一张你应该就已经看到过Response对象,之前是使用它的AsFile 方法返回一个简单文件. using Nancy; nam ...
- Django 2.0 学习(03):Django视图和URL(下)
接上篇博文,继续分析Django基本流程. 编写第一个(view)视图函数 1.打开文件polls/views.py,输入下面的Python代码: from django.http import Ht ...
- 简简单单把event loop说清楚
event loop这东西,确实把我坑了一把,面试的时候被问到这个问题的时候,我是懵逼的,完全不知道怎么回答,而当我回来查到原来这个听起来如此玄乎又厉害的名字就是异步和单线程那块的知识的时候,我心情又 ...
- 【python学习笔记】9.魔法方法、属性和迭代器
[python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...