2017-04-16 33 views
1

我在SQL Server中存储文本的正文。在SQL Server中检测Unicode文本

某些文本正文包含的Unicode字符在SQL Server中的VARCHAR列中存储时将丢失。

由于只存储需要一个NVARCHAR列文本机构的一小部分,我决定创建2列,一为VARCHAR文本,另一个是NVARCHAR文本。通过这种方式,我可以节省空间,只需在NVARCHAR列中存储Unicode正文文本,其余部分则存储在VARCHAR列中。

问题是:如何检测文本正文是否包含Unicode字符,以便我可以确定将其存储在最佳列中?

回答

2

你既可以决定你整理的代码页提供的256个字符,并检查是否有任何字符字符串不在该组或将其转换为varchar,然后将其比作nvarchar原件。

如果使用代码页1252,则第一种方法可以用

DECLARE @String NVARCHAR(MAX) = N'൯' 

SELECT CASE 
     WHEN @String LIKE '%[^' COLLATE Latin1_General_100_BIN + CHAR(0) + '-' + CHAR(255) + ']%' 
      THEN 'varchar not OK' 
     ELSE 'varchar OK' 
     END 

和第二种方式来完成...

DECLARE @String NVARCHAR(MAX) = N'൯' 

SELECT CASE 
     WHEN CAST(@String AS VARCHAR(MAX)) = @String 
      THEN 'varchar OK' 
     ELSE 'varchar not OK' 
     END 

BTW:如果您使用行压缩你也可以得到所引发的Unicode压缩将在很大程度上否定对此的需求。

+0

使用压缩听起来像是一个更好的选择,但我相信对使用本地SQL压缩可以压缩多大的字段有限制。我可以使用SQL CLR库实现压缩,如gzip。 –

+0

@EliPerpinyal行和页面压缩(其中包括[unicode压缩](https://technet.microsoft.com/en-us/library/ee240835(v = sql.110).aspx))仅适用于存储在行中的数据不是大对象数据。 SQL Server 2016为GZIP压缩提供了内置的'COMPRESS'功能。 –