【问题标题】:SQL Server 2014 Case Sensitivity issueSQL Server 2014 区分大小写问题
【发布时间】:2016-09-30 09:56:14
【问题描述】:

我正在将数据库和 etl 从 MySQl 迁移到 SQL Server,并且遇到了区分大小写的问题。 在 MySql 中,数据库设置为区分大小写,因为我们从中加载的应用程序之一在一组中具有像“Divh”和“divh”这样的代码(这不是我做的) 一切都很好,etl 中的 select 语句、查询报告等都使用了作者想要的关于 case 的任何内容 - 有些都是 UPPER 一些都是最低混合的。 所以,换句话说,MYSql 有不区分大小写的 DDL 和 SQL,但允许区分大小写的数据。

SQL Server 似乎无法适应这种情况。如果我选择 CI 排序规则,则所有表和列以及数据(大概)都是不敏感的。 反之亦然 - 如果它的 CS 一切都区分大小写。 我读对了吗? 如果是这样,那么我要么必须更改数据库中每个文本列的排序规则 或编辑每个查询。

具有讽刺意味的是,第一次测试是针对使用相同排序规则 (SQL_Latin1_General_CP1_CS_AS) 设置的 Azure SQL 数据库 它不关心选择中表名的大小写。

有什么想法吗?

谢谢 JC

【问题讨论】:

    标签: sql-server database azure case-sensitive


    【解决方案1】:

    首先,您知道排序规则设置存在于 SQL Server 的每个级别;实例、数据库、表甚至字段级别。

    听起来您只想对受影响的字段强制执行区分大小写的排序规则,而将数据库和 DDL 作为一个整体不区分大小写。

    我过去使用的另一个技巧是将值转换为 VARBINARY 数据类型,如果您想在不同情况之间进行数据比较,但无需更改任何内容的排序规则。

    例如:

    DECLARE @Var1 VARCHAR(5) 
    DECLARE @Var2 VARCHAR(5)
    
    SET @Var1 = 'Divh' 
    SET @Var2 = 'divh'
    
    --Comparison1:
    IF @Var1 = @Var2
        PRINT 'Same'
    ELSE
        PRINT 'Not the same'
    
    --Comparison2:
    IF CAST(@Var1 AS VARBINARY) = CAST(@Var2 AS VARBINARY)
        PRINT 'Same'
    ELSE
        PRINT 'Not the same'
    

    【讨论】:

    • 保罗感谢您的提示。是的,我想保持数据库不区分大小写,但大约 200 列需要区分大小写。我试图说服建模工具通过更改数据域来生成它,这样我就不必断开这么多列上的链接。
    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2011-03-24
    • 2014-05-10
    相关资源
    最近更新 更多