前不久为一个美国客户做了个.net程序,在创建数据库的时候没有注意collation就使用了默认的Server Collation设置:Chinese_PRC_CI_AS。而在安装过程中,我们使用我们这边的一个seed database的备份数据库恢复来把数据库安装到客户的SQL Server上面。结果不久之后客户使用过程中就发现异常。后来仔细查看后才发现原因,就是客户SQL Server的collation和我们数据库的collation设置不一致。客户的SQL Server使用Latin1_General_CI_AS,服务器上的所有默认数据库都是使用这个collation,包括temp, master数据库。只有我们的数据库是Chinese_PRC_CI_AS。由于我们在部分存储过程里面使用了临时表保存数据,而临时表放在temp数据里面,在创建临时表的时候对string类型的字段如果不指定的话就会使用temp数据库的默认collation设置。在我们的开发环境里面测试不会有任何问题,但是程序到客户那里后就出现问题了,应为在SQL Server不同collation的数据是不能进行比较的,当我们运行使用到使用到临时表的功能时就会报错。
当客户报这个错误的时候,刚开始没有想到是这个原因,我们花了不少时间想法设法在开发环境里面重现这个错误,最后安装了一套和客户软件环境一模一样的系统后才发现是这个原因。目前的解决方法是在在创建临时表的时候强行把string等类型的collation设置为Chinese_PRC_CI_AS. 这样临时表的collation的设置就和我们的数据库里面的一致。
建议大家最好在设计阶段就把这些问题考虑进去。