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了,可以方便地测试运行小型项目:既然是轻量级数据库,它抛弃了庞大的身躯,功能上当然也会受到局限,其中之一 ...
随机推荐
- 爬虫工具fiddle在firefox浏览器中的使用
1.fiddle工作原理 浏览器与服务器之间通过建立TCP连接以HTTP协议进行通信,默认通过自己发送HTTP(或HTTPS)请求到服务器. 使用Fiddler之后,浏览器像目标服务器发送的请求都会经 ...
- 【BZOJ4555】求和(第二类斯特林数,组合数学,NTT)
[BZOJ4555]求和(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 推推柿子 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)·j!·2^j\] \[=\sum_{i= ...
- 通过Navicat连接MySQL数据库
步骤一.从Navicat官网下载Navicat11版本安装包安装 下载连接:http://www.formysql.com/xiazai_mysql.html 步骤二.下载补丁破解程序PatchNav ...
- MySQL事务以及隔离级别
前言: 我一直想不到一个好的标题应该怎么写.我想MySQL的一些重要的内容.我在两次面试中都遇到过的,但直接用MySQL标题好像又不太贴切.干脆就是所写的内容吧. MySQL事务: transacti ...
- Android中Activity.this,getApplicationContext(),getBaseContext()和this详解
转自:http://android.tgbus.com/Android/tutorial/201103/346236.shtml 在使用Android上下文参数的时候经常分不清Activity.thi ...
- JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别 关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来 ...
- npm打包前端项目太慢问题分析以及暂时解决方案
npm build 打包前端项目实际上是执行 node build/build.js,但是随着项目的依赖包越来越多,项目打包时间不断延长,为了改善这个问题,需要从node入手 暂时解决方案:扩大nod ...
- Tensorflow小技巧整理:修改张量特定元素的值
TensorFlow小技巧整理:修改张量特定元素的值 最近在做一个摘要生成的项目,过程中遇到了很多小问题,从网上查阅了许多别人解决不同问题的方法,自己也在旁边开了个jupyter notebook搞些 ...
- unity3D加密如何做到防编译?
先介绍对unity3D程序进行加密的几种方式. Unity3D是一个基于Mono框架的跨平台游戏开发引擎,Unity3D所使用的Mono属于Mono开源项目的分支 在Unity3D中,代码会编译到As ...
- IPFS家族(一)
IPFS这个项目其实很大,并不像大家想象的是一个东西,IPFS是由很多模块组成,每一个模块现在都已经独立成项目了,并且有自己的主页.让我们来简单看一下IPFS家族成员. 协议实验室的主页:https: ...