说到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相关推荐

  1. 在Migration中操作新添加的字段

    在Migration中操作新添加的字段 By YUANYI | Published: MAY 22, 2008 在有些情况下,我们需要在某个migration中对新增加的字段进行操作,比如下面这个将n ...

  2. OrchardHUN.TrainingDemo 学习记录(2)-Migration中,添加contentPart 和widget

    例子: usingOrchard.ContentManagement.MetaData;usingOrchard.Core.Contents.Extensions;usingOrchard.Data. ...

  3. Asp.net core中Migration工具使用的交流分享

    一.文章参数 开发工具: visual studio 2015 community update 3 + .net core tools(preview2) + sqlserver2012 expre ...

  4. mysql按升序创建索引_Mysql中的降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引 ...

  5. Flask-SQLAlchemy 中如何不区分大小写查询?

    例如下面的 User 模型,在数据库中查询时并不会区分大小写 class User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer ...

  6. 解决办法: Cannot resolve the collation conflict between Japanese_CI_AS and SQL_...

    问题描述:今天在执行创建视图操作的时候,出现了如下错误 Cannot resolve the collation conflict between "Japanese_CI_AS" ...

  7. 数据库设计中的命名规范

    1.引言 数据库设计过程中表.字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理性.为了项目最终的协调稳定性,而命名规范则更多的是为了确保设计的正式和统一.公正的讲, ...

  8. 【杨镇】【中译修订版】以太坊的分片技术官方介绍

    杨镇,资深软件架构师,资深开发工程师.以太坊技术爱好者与布道者. 是Solidity官方文档中译项目的重要贡献者,以太坊Homestead官方文档中文版译者,并对以太坊黄皮书中文版.Thunder共识 ...

  9. 汉字和英文在计算机与mysql中的存储

    1.计算机 普及字符是如何被存储的.在计算机中,所有数据都是用0和1这样的位来描述.一个字节有8位,因此一个字节最多可以描述256个字符.在欧美国家,比如美国,他们的文字字符主要就是26个字母加上一些 ...

  10. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

最新文章

  1. 2021年大数据ELK(二十七):数据可视化(Visualize)
  2. 数据结构_队列_mindmap
  3. 需要某个字体包才能正确显示此页面_如何做设计,才能做好设计
  4. ios点击推送闪退_苹果推送iOS 14.2 beta 1:千万别更新,大批应用闪退
  5. C#坏习惯:通过不好的例子学习如何制作好的代码——第5部分
  6. MySQL 处理海量数据时一些优化查询速度方法
  7. AngularJs 实战 -慕课网
  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_1_缓冲流的原理...
  9. Selenium2用最简xpath查找元素
  10. html星号密码查看器,万能星号密码查看器
  11. 冰点——收费文档的下载利器
  12. 什么是IPv6?IPv6与IPv4有什么区别?IPv6的安全?
  13. UOS 下wine的记录
  14. ALU计算机专业术语,计算机专业术语大全
  15. 基于android的共享车位app
  16. linux usb 批量传输文件,一种Linux系统下提升usb批量传输速度的方法及系统与流程...
  17. Qt保存Excel格式数据
  18. 通过socks 代理 攻击局域网的电脑
  19. 《如何在大学里脱颖而出(How to Win at College)》读书笔记
  20. 【Java编程学习】案例8-4 模拟12306售票

热门文章

  1. 三天搭建内容推荐系统——标签挖掘、画像搭建、算法推荐
  2. 惠普笔记本的Windows10和Ubuntu20.04双系统安装教程
  3. 一篇文章看懂Facebook和新浪微博的智能FEED
  4. facebook,twitter,pinterest的分享功能代码--js+html
  5. osg qt 三维模型加载
  6. pig java api_pig CheckToken过程讲解
  7. Spring boot(四):整合Mybatis
  8. 互联网背景下为什么会出现NoSQL?
  9. .Net服务器性能监控,应用耗时统一监控平台
  10. HighNewTech:元宇宙(metaverse)的简介(多角度理解与探讨)、发展历史、现状与未来