zoukankan      html  css  js  c++  java
  • 针对解决sql server数据库中不区分大小写问题.(转)

    转自:http://blog.csdn.net/sx811125/article/details/5785142

    在网络上搜索相关的很多资料,总结了一下,发生这种情况的原因主要是由于排序规则引起的:
    不指定排序规则的话

    临时表是否区分大小写,与tempdb数据库的排序有关.
    数据库对象是否区分大小写,与数据库本身的排序规则有关.
    变量是否区分大小写,与数据库本身的排序规则有关,估计也是与tempdb数据库有关吧.
    二进制编码:根据针对每个字符定义的位模式来排序与比较Microsoft®SQL Server™资料表中的资料。 Binary排序方式区分大小写,亦即小写比大写优先,且区分腔调字。这是最快的排序方式。
    若未选取此选项,SQL Server将遵循关联之语言或字母的字典内定义的排序与比较规则。

    区分大小写指定SQL Server区分大写与小写字母。若未选取此选项,SQL Server会将大写与小写字母视为相等。若您没有选取[区分大小写],SQL Server并不会定义小写字母与大写字母的排序方式何者较高.

    解决方案:
    方法一.安装SQL时选择区分大小写或安装完以后重建mastar,选择区分大小
    C:/Program Files/Microsoft SQL Server/80/Tools/Binn/rebuildm.exe

    方法二.sql server 8.0以上的版本才可以,7.0及其以下不支持
    alter database 数据库 COLLATE Chinese_PRC_CS_AS
    修改排序规则,改成大小写敏感的排序规则
    如果只修改一个表,用alter table语句
    如果修改一个库的默认排序规则,用alter datebase语句
    如果修改整个服务器的默认排序规则,用Rebuildm.exe重建master库

    --指定排序规则就可以了

    --示例
    select replace('AbacB' collate Chinese_PRC_CS_AS_WS,'B','test')

    --如果你是要求表支持,则可以建表时指定排序规则,这样replace就不用写排序规则了

    --示例
    create table tb(a varchar(20) collate Chinese_PRC_CS_AS_WS)
    insert tb values('Abac')

    select replace(a,'a','test') from tb

    drop table tb


    小结一下:
    --表
    ALTER TABLE tb
    ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS
    --不区分大小写
    ALTER TABLE tb
    ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CS_AS
    --区分大小写
    数据库
    ALTER DATABASE database
    COLLATE Chinese_PRC_CS_AS
    --区分大小写

    ALTER DATABASE database
    COLLATE Chinese_PRC_CI_AS
    --不区分大小写

    指定排序规则即可
    Windows 排序规则名称
    在COLLATE子句中指定Windows排序规则名称。Windows排序规则名称由排序规则指示器和比较风格构成。
    语法:
    <Windows_collation_name> :: =
    CollationDesignator_<ComparisonStyle>
    <ComparisonStyle> ::=
    CaseSensitivity_AccentSensitivity
    [_KanatypeSensitive [_WidthSensitive ] ]
    | _BIN

    参数
    CollationDesignator
    指定Windows 排序规则使用的基本排序规则。基本排序规则包括:

    当指定按字典排序时应用其排序规则的字母表或语言


    用于存储非 Unicode 字符数据的代码页。
    例如 Latin1_General 或法文,两者都使用代码页 1252,或土耳其文,它使用代码页 1254。

    CaseSensitivity

    CI 指定不区分大小写,CS 指定区分大小写。

    AccentSensitivity

    AI 指定不区分重音,AS 指定区分重音。

    KanatypeSensitive

    Omitted 指定不区分大小写,KS 指定区分假名类型。

    WidthSensitivity

    Omitted 指定不区分大小写,WS 指定区分大小写。

    BIN

    指定使用二进制排序次序。


    如果你只是目前查询区分,那么还是不要这样改,免得又反悔,如此查询:
    select * from a
    /*
    a_nam a_add
    ---------- ----------
    1 aa
    1 bb
    2 cc
    2 vv
    2 kk
    3 dd
    3 ee
    4 dd
    5 ee
    6 yy
    6 yy

    (11 row(s) affected)
    */
    现在我们查询a_add = 'aa'的,'Aa'等等不行!
    Example 1:

    select * from a
    where a_add collate Chinese_PRC_CS_AS_WS = 'aa'
    /*
    a_nam a_add
    ---------- ----------
    1 aa

    (1 row(s) affected)
    */

    Example 2:

    select * from a
    where a_add collate Chinese_PRC_CS_AS_WS = 'Aa'
    /*
    a_nam a_add
    ---------- ----------

    (0 row(s) affected)
    */

    方法三.上面的记不住,那么就用最笨的方法,转化为ascii
    select * from a
    where
    ascii(substring(a_add,1,1)) = ascii(substring('Aa',1,1))
    and
    ascii(substring(a_add,2,1)) = ascii(substring('Aa',2,1))
    /*
    a_nam a_add
    ---------- ----------

    (0 row(s) affected)
    */

    方法三:任何版本都可以

    select * from a
    where cast(a_add as varbinary(10))= cast('aa' as varbinary(10))


  • 相关阅读:
    jdk silent install test
    jdk silent install
    PS_note_01
    string.split('',-1)的作用
    dos下静默安装
    dos命令中rem 与::的区别
    barcode4j用法
    查看tomcat的版本
    eclipse里启动rabbitmq报错 java.net.SocketException: Connection reset
    Mysql性能调优
  • 原文地址:https://www.cnblogs.com/jery0125/p/2731276.html
Copyright © 2011-2022 走看看