我的数据库的资料是繁体的,下面的语句是按字节截取字符串,但是结果出现乱码?
有没有办法可以解决啊?
SELECT cast(substring(convert(TEXT,'數位奇蹟 - CMOS IR IP cam (WLAN)'),6,5) AS VARCHAR)

解决方案 »

  1.   

    SELECT cast(substring(convert(TEXT,N'數位奇蹟 - CMOS IR IP cam (WLAN)'),6,5) AS NVARCHAR)改 NVARCHAR呢,先就说了,繁体的字可能有问题,排序规则要改一下试试
      

  2.   

    编码问题
    varchar()-->nvarchar()
    或者在字符串前面加上N'數位奇蹟'
      

  3.   

    同意应该Unicode编码问题。加前导符N
      

  4.   

    是按字节截取字符串?不是按字符?declare @s varchar(100);
    set @s='數位奇蹟 - CMOS IR IP cam (WLAN)';-- 截取字符串中第 5 个字节,长度为 4 字节的子字符串
    declare @start int,@len int;
    select @start=5, @len=4;set @start=len(convert(varchar,substring(convert(varbinary,@s),1,@start)));
    select convert(varchar,substring(convert(varbinary,substring(@s,@start,len(@s))),1,@len));
      

  5.   


    '數位奇蹟 - CMOS IR IP cam (WLAN)'这个是我从数据库里随便选了一个作为例子啊.
    用N怎么对整个栏位处理啊.?
      

  6.   

    恩..是按字节截取.
    你给的这个方法好像可以消除乱码..但是不能截取到我想要的子字符串,给了他开始位置(start)和长度(len)但是截取出来的子字符串不是我想要的.
      

  7.   


    SELECT cast(substring(convert(Ntext,N'數位奇蹟 - CMOS IR IP cam (WLAN)'),6,5) AS VARCHAR)
    ------------------------------ 
    - CMO(所影响的行数为 1 行)
      

  8.   

    无非是对起始位理解的不同。给几个例子,先。declare @s varchar(100);
    set @s='數位奇蹟 - CMOS IR IP cam (WLAN)';declare @start int,@len int;
    select @start=6, @len=5;set @start=len(convert(varchar,substring(convert(varbinary,@s),1,@start)))+1;
    select convert(varchar,substring(convert(varbinary,substring(@s,@start,len(@s))),1,@len));
    /*
    蹟 - 
    */
      

  9.   


    SELECT cast(substring(convert(TEXT,'數位奇蹟 - CMOS IR IP cam (WLAN)'),7,5) AS VARCHAR)
                                   
    ------------------------------ 
    蹟 - (所影响的行数为 1 行)
      

  10.   

    declare @s varchar(100);
    set @s='DP001     小小大大DP002     我們大家'declare @start int,@len int;
    select @start=28, @len=8;
    set @start=len(convert(varchar,substring(convert(varbinary,@s),1,@start)))+1;
    select convert(varchar,substring(convert(varbinary,substring(@s,@start,len(@s))),1,@len));我截取第29到37byte就錯了,沒有截取到正確字符串,結果應該是:我們大家,這個的結果是:     我
    上面中間的空格都是5個空格
      

  11.   

    set @s='DP001[5個空格]小小大大DP002[5個空格]我們大家'
      

  12.   


    -- 简单的处理办法就是用特定字符替换空格,不过有局限
    declare @s varchar(100);
    set @s='DP001     小小大大DP002     我們大家';declare @start int,@len int;
    select @start=28, @len=8;set @start=len(convert(varchar,substring(convert(varbinary,replace(@s,' ','#')),1,@start)))+1;
    select replace(convert(varchar,substring(convert(varbinary,substring(@s,@start,len(@s))),1,@len)),'#',' ');
      

  13.   

    還有你這個不能用varbinary.. 用這個的話對取數據庫的資料會出現亂碼... 我改成text就額可以了.