Migration中的Collation Confliction
说到SQL中的collation(校对集),相信大家都清楚它是用来指定排序规则的。同时大部分人应该都会赞同,排序功能优先级很低,绝对不应该跟show stopper划上等号,所以一般不会安装排在前几个sprint中来进行实现。就历史经验看,即便是到了最后的几个sprint,也未必会把collation这种corner case提上日程。而本文的主人公正是这个不起眼的小配角,看看他是如何通过不懈努力,终于成功抢戏的真实案例。
故事发生在德语Windows环境+SQL Server上,测试人员如何辛苦的部署data migration环境,如何严格的按照测试用例步步执行暂且不表。而就在整个测试即将完成时,FATAL ERROR出现了,软件升级过程中的数据迁移以为失败告终,所有非英文系统上的数据迁移都完全被block住!经过反复尝试,问题依旧。
通过查看log日志,发现一段德语ERROR记录。
System.Data.SqlClient.SqlException (0x80131904): Ein Sortierungskonflikt zwischen 'SQL_Latin1_General_CP1_CI_AS' und 'Latin1_General_CI_AS' im equal to-Vorgang kann nicht aufgelöst werden.
将其翻译成为英文大体意思如下:
System.Data.SqlClient.SqlException(0x80131904): collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS 'in the equal to operation can not be resolved.
通过查看建立表单的SQL文件,发现这里并未明示collation的名称。
CREATE TABLE [Migration].[UserTables]
([Id] Int Not NULL Primary Key Identity(1,1),[TableName] NVARCHAR(128),[ColumnName] NVARCHAR(128),[NTName] NVARCHAR(256),[UserId] Int NULL,[FoundCount] Int Not NULL DEFAULT(0),[ConvertedCount] int Not NULL DEFAULT(0))
GO
这就难怪了!你不指定,系统就会“帮你”指定一个它认为最合适的。英文SQL Server默认的collation就是SQL_Latin1_General_CP1_CI_AS,其中
Latin1表示系统会用ASCII码表处理字符
CI代表大小写不敏感,所以 'I18N'跟 'i18n'相等
AS则表示对重音符号敏感,这样'ü' 和'u'就不再等价
而在德文环境下,默认的collation则是Latin1_General_CI_AS。
二者区别如下:
SQL_Latin1_General_CP1_CI_AS collation是SQL的校对集,它作用于Unicode和非Unicode 数据排序是不同的
Latin1_General_CI_AS collation是一个Windows校对集,它对Unicode和非Unicode的数据排序处理则是一样的
知道了问题的根源所在,我们就需要建表的时候指定期望使用的collation,对示例代码作出如下修改:
CREATE TABLE [Migration].[UserTables]
([Id] Int Not NULL Primary Key Identity(1,1),[TableName] NVARCHAR(128) COLLATE SQL_Latin1_General_CP1_CI_AS,[ColumnName] NVARCHAR(128) COLLATE SQL_Latin1_General_CP1_CI_AS,[NTName] NVARCHAR(256) COLLATE SQL_Latin1_General_CP1_CI_AS,[UserId] Int NULL,[FoundCount] Int Not NULL DEFAULT(0),[ConvertedCount] int Not NULL DEFAULT(0))
GO
再次测试,顺利通过!故事讲完了,至此大家还依然觉得collation是个无关痛痒的小配角么?
Migration中的Collation Confliction相关推荐
- 在Migration中操作新添加的字段
在Migration中操作新添加的字段 By YUANYI | Published: MAY 22, 2008 在有些情况下,我们需要在某个migration中对新增加的字段进行操作,比如下面这个将n ...
- OrchardHUN.TrainingDemo 学习记录(2)-Migration中,添加contentPart 和widget
例子: usingOrchard.ContentManagement.MetaData;usingOrchard.Core.Contents.Extensions;usingOrchard.Data. ...
- Asp.net core中Migration工具使用的交流分享
一.文章参数 开发工具: visual studio 2015 community update 3 + .net core tools(preview2) + sqlserver2012 expre ...
- mysql按升序创建索引_Mysql中的降序索引底层实现
什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引 ...
- Flask-SQLAlchemy 中如何不区分大小写查询?
例如下面的 User 模型,在数据库中查询时并不会区分大小写 class User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer ...
- 解决办法: Cannot resolve the collation conflict between Japanese_CI_AS and SQL_...
问题描述:今天在执行创建视图操作的时候,出现了如下错误 Cannot resolve the collation conflict between "Japanese_CI_AS" ...
- 数据库设计中的命名规范
1.引言 数据库设计过程中表.字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理性.为了项目最终的协调稳定性,而命名规范则更多的是为了确保设计的正式和统一.公正的讲, ...
- 【杨镇】【中译修订版】以太坊的分片技术官方介绍
杨镇,资深软件架构师,资深开发工程师.以太坊技术爱好者与布道者. 是Solidity官方文档中译项目的重要贡献者,以太坊Homestead官方文档中文版译者,并对以太坊黄皮书中文版.Thunder共识 ...
- 汉字和英文在计算机与mysql中的存储
1.计算机 普及字符是如何被存储的.在计算机中,所有数据都是用0和1这样的位来描述.一个字节有8位,因此一个字节最多可以描述256个字符.在欧美国家,比如美国,他们的文字字符主要就是26个字母加上一些 ...
- GNU Make 使用手册(于凤昌中译版)
GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...
最新文章
- 2021年大数据ELK(二十七):数据可视化(Visualize)
- 数据结构_队列_mindmap
- 需要某个字体包才能正确显示此页面_如何做设计,才能做好设计
- ios点击推送闪退_苹果推送iOS 14.2 beta 1:千万别更新,大批应用闪退
- C#坏习惯:通过不好的例子学习如何制作好的代码——第5部分
- MySQL 处理海量数据时一些优化查询速度方法
- AngularJs 实战 -慕课网
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_1_缓冲流的原理...
- Selenium2用最简xpath查找元素
- html星号密码查看器,万能星号密码查看器
- 冰点——收费文档的下载利器
- 什么是IPv6?IPv6与IPv4有什么区别?IPv6的安全?
- UOS 下wine的记录
- ALU计算机专业术语,计算机专业术语大全
- 基于android的共享车位app
- linux usb 批量传输文件,一种Linux系统下提升usb批量传输速度的方法及系统与流程...
- Qt保存Excel格式数据
- 通过socks 代理 攻击局域网的电脑
- 《如何在大学里脱颖而出(How to Win at College)》读书笔记
- 【Java编程学习】案例8-4 模拟12306售票
热门文章
- 三天搭建内容推荐系统——标签挖掘、画像搭建、算法推荐
- 惠普笔记本的Windows10和Ubuntu20.04双系统安装教程
- 一篇文章看懂Facebook和新浪微博的智能FEED
- facebook,twitter,pinterest的分享功能代码--js+html
- osg qt 三维模型加载
- pig java api_pig CheckToken过程讲解
- Spring boot(四):整合Mybatis
- 互联网背景下为什么会出现NoSQL?
- .Net服务器性能监控,应用耗时统一监控平台
- HighNewTech:元宇宙(metaverse)的简介(多角度理解与探讨)、发展历史、现状与未来