【问题标题】:How to identify unicode text in sql?如何识别sql中的unicode文本?
【发布时间】:2017-10-03 04:39:03
【问题描述】:

Table1 有一个名为 umsg 的 nvarchar 列,其中包含 unicode 文本和一些英文。

我想找出 umsg 列中存在的英文文本。

select * 
from table1 
where 
    RDate >='01/01/2014' and RDate < '09/26/2017' 
    and umsg = convert(varchar(max), umsg)

我使用的上述查询在区域语言中运行良好,但有时会失败。 假设 col 包含诸如“ref no été”之类的文本 我认为上面的消息是 unicode,如果我使用上面的查询,it/sql 显示为英文而不是 unicode。如何处理。

Table :
Id  Date                      Umsg
1   2017-09-12 00:00:00.000   The livers detoxification processes.
2   2017-09-11 00:00:00.000   Purposely added 1 
3   2017-09-10 00:00:00.000   फेंगशुई के छोटे-छोटे टिप्स से आप जीवन की विषमताओं से                       स्वयं को बचा सकते
4   2017-09-17 00:00:00.000    तनाव एक लाइलाज बीमारी कतई नहीं है। कुछ लोग तनाव को                                     आसानी से झेल लेते ह
5   2017-09-17 00:00:00.000    ref no été

以上是我的表格中的数据。 但我想要像这样的数据/输出:

    Id      Date                      Umsg
    1   2017-09-12 00:00:00.000   The livers detoxification processes.
    2   2017-09-11 00:00:00.000   Purposely added 1

【问题讨论】:

  • @Jui 测试,在 where 条件下尝试使用 nvarchar 而不是 varchar。转换(nvarchar(最大),umsg)。
  • 是的,我使用的是 sql server 2012
  • 为什么使用 varchar 而不是 nvarchar
  • 我不能使用nvarchar,如果我使用它也会给出所有unicode消息。我只想要英文消息。列已经是Nvarchar类型。再次将其转换为nvarchar,没有意义。
  • @Jui Test 如果字符串同时包含 unicode 和 ascii 字符,输出会是什么样子?

标签: sql sql-server sql-server-2012


【解决方案1】:

检查如下:

;WITH CTE
 AS (
 SELECT ID,
        DATE,
        umsg,
        CASE
            WHEN(CAST(umsg AS VARCHAR(MAX)) COLLATE SQL_Latin1_General_Cp1251_CS_AS) = umsg
            THEN 0
            ELSE 1
        END HasSpecialChars
 FROM <table_name>)
 SELECT ID,
        DATE,
        umsg
 FROM CTE
 WHERE Date >= '01/01/2014'
       AND Date < '09/26/2017'
       AND HasSpecialChars = 0;

期望的输出:

ID  DATE                     umsg
1   2017-09-12 00:00:00.000  The livers detoxification processes.                                                                     
2   2017-09-11 00:00:00.000  Purposely added 1      

希望对你有帮助。

【讨论】:

    【解决方案2】:

    如果同一字符串中有一些 unicode 和一些 ascii 字符,你没有回答你想要的,所以如果你只想找到“纯英语”或“混合”,我给你一个想法和一个解决方案" 行。

    您需要一个自然数表来执行此操作。如果您没有这样的表,您可以像这样生成它:

    select top 1000000  row_number() over(order by getdate()) as n
    into dbo.nums
    from sys.messages m1 cross join sys.messages m2;
    
    alter table dbo.nums alter column n int not null;
    
    alter table dbo.nums add constraint PK_nums_n primary key(n); 
    

    现在您有了一个自然数表,我们将把您的字符串分解为单个字符,以检查 ascii(character) = unicode(character)

    declare @t table(col Nvarchar(200));
    insert into @t values
    (N'ref no été'), (N'The livers detoxification processes.'), (N'फेंगशुई के छोटे-छोटे टिप्स से आप जीवन की विषमताओं से')
    
    select t.col, n, substring(t.col, n, 1) as nth_character,
           ascii(substring(t.col, n, 1)) as ascii,
           unicode(substring(t.col, n, 1)) as uni
    from @t t join dbo.nums n
           on n.n <= len(t.col); -- this is to give you an idea how to see if it's unicode character or ascii
    
    with cte as
    (
    select t.col, n, substring(t.col, n, 1) as nth_character,
           ascii(substring(t.col, n, 1)) as ascii,
           unicode(substring(t.col, n, 1)) as uni
    from @t t join dbo.nums n
           on n.n <= len(t.col)
    )
    select col, 
           case
                when sum(case when ascii = uni then 1 else 0 end) = count(*) then 'English only'
                else 'Not only English'
           end as eng_or_not
    from cte
    group by col -- row level solution
    

    代码的第一部分逐个字符地显示您的字符串以及字符的 ascii ande unicode 代码:它们相同的是 ascii 字符。

    第二部分只是检查所有字符是否都是ascii。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多