我在SQL Server中存储文本正文。
某些文本正文包含Unicode字符,这些字符在SQL Server中的VARCHAR
列中存储时会丢失。
由于只存储了一小部分文本正文需要NVARCHAR
列,因此我决定创建2列,一列用于VARCHAR
文本,另一列用于NVARCHAR
文本。通过这种方式,我可以通过仅在NVARCHAR
列中存储Unicode文本正文并将其余部分存储在VARCHAR
列中来节省空间。
问题是:如何检测文本正文是否包含Unicode字符,以便我可以确定存储它的最佳列?
答案 0 :(得分:2)
您可以确定排序规则代码页中可用的256个字符,并检查字符串中是否有该组中没有的字符或将其转换为varchar
,然后将其与nvarchar
原始字段进行比较。< / p>
如果您使用的是代码页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压缩,这在很大程度上抵消了对此的需求。