如何选择含有中日文字的行?

问题描述 投票:0回答:3

如何按中日类似字符过滤列?我正在尝试做类似的事情

SELECT * FROM my_table WHERE column LIKE '%[A-Za-z]%'

可以输入中文或日文吗?

sql sql-server character chinese-locale
3个回答
10
投票

使用 unicode 字符串时,您始终需要在字符串前添加

N
前缀,以明确告诉 sql server 操作中可以存在 unicode 字符。 INSERT、UPDATE、SELECT 和 DELETE 对于所有操作都是如此。

在选择数据时,在 where 子句中,您需要在搜索字符串前添加

N
。像这样的东西......

SELECT * 
FROM my_table 
WHERE column LIKE N'%[A-Z]%' --<-- using Japanese characters here 
OR    Column LIKE N'%[a-z]%' --<-- using Japanese characters here 

0
投票

以下可能对我有用。

    SELECT * FROM my_table WHERE LEN(RTRIM(my_column)) <> DATALENGTH(RTRIM(my_column))

len
函数可能会忽略尾随空格,因此最好在测量长度之前修剪它。 以上来自日本网页上的建议。


0
投票

我最终编写了一个函数来解析字符串的每个字符并检查 UNICODE() 值是否在 CJK 字符的范围内。这并不能明确地使其仅成为中文,但确实获得了汉字/汉字字符。我合成了几个连续的范围。

Unicode 块描述:http://zuga.net/articles/unicode-all-blocks/?highlight=104

其中一些整数值超出了 SQL 使用 UNICODE 和 NCHAR 函数可以解释的范围。我欢迎对此 SQL 函数提供建设性反馈。

SQL 函数:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Tim Bessler
-- Create date: 13 NOV 2023
-- Description: Searches each character in a string to detect if any fall inside the range of 
--  Chinese (or CJK, broadly) unicode blocks. IMPORTANT: string literals must be prefixed N to
--  properly evaluate UTF8 / nvarchar.
--
-- Returns true upon finding any, otherwise returns false
-- =============================================
ALTER FUNCTION ContainsHanzi 
(
    -- Add the parameters for the function here
    @Input nvarchar(MAX)
)
RETURNS bit
AS
BEGIN
    -- Declare the return variable here
    DECLARE @HasHanzi bit = 0
    DECLARE @InputLength int, @ix int = 1 --start at index 1, iterate thru the string char by char
    DECLARE @unicodeValue int
    
    --set loop range to iterate thru the whole string
    SET @InputLength = LEN(@Input)

    --Loop thru the loop until we reach the end of the string OR we detect Hanzi
    WHILE (@ix <= @InputLength AND NOT @HasHanzi = 1)
    BEGIN
        SET @unicodeValue = UNICODE(SUBSTRING(@Input, @ix, 1))
        --consolidated range of Unicode block integer values for Hanzi / CJK characters
        SET @HasHanzi = CASE 
            WHEN (@unicodeValue >= 11904 AND @unicodeValue <= 12031) OR
                 (@unicodeValue >= 12288 AND @unicodeValue <= 12351) OR
                 (@unicodeValue >= 12736 AND @unicodeValue <= 12783) OR
                 (@unicodeValue >= 12800 AND @unicodeValue <= 19903) OR
                 (@unicodeValue >= 19968 AND @unicodeValue <= 40959) OR
                 (@unicodeValue >= 63744 AND @unicodeValue <= 64255) OR
                 (@unicodeValue >= 65072 AND @unicodeValue <= 65103) OR
                 (@unicodeValue >= 131072 AND @unicodeValue <= 195103)
            THEN 1 ELSE 0 END
        SET @ix = @ix + 1
    END

    -- Return the result of the function
    RETURN @HasHanzi

END
GO

使用示例:

WITH src (Pepsi, Lang) AS (
    SELECT N'Pepsi', 'English'
    UNION
    SELECT N'ペプシ', 'Japanese (Katakana)'
    UNION
    SELECT N'百事可乐', 'Chinese')
SELECT Pepsi, Lang, dbo.ContainsHanzi(Pepsi) as ContainsHanzi
FROM src;

结果:

百事可乐(英文)= 0

ペプシ(日语(片假名))= 0

百事可乐(中文)= 1

© www.soinside.com 2019 - 2024. All rights reserved.