如何按中日类似字符过滤列?我正在尝试做类似的事情
SELECT * FROM my_table WHERE column LIKE '%[A-Za-z]%'
可以输入中文或日文吗?
使用 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
以下可能对我有用。
SELECT * FROM my_table WHERE LEN(RTRIM(my_column)) <> DATALENGTH(RTRIM(my_column))
len
函数可能会忽略尾随空格,因此最好在测量长度之前修剪它。
以上来自日本网页上的建议。
我最终编写了一个函数来解析字符串的每个字符并检查 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