【问题标题】:Detecting Unicode Text in SQL Server在 SQL Server 中检测 Unicode 文本
【发布时间】:2023-04-05 05:54:01
【问题描述】:

我将正文存储在 SQL Server 中。

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

由于存储的文本正文中只有一小部分需要NVARCHAR 列,因此我决定创建2 列,一个用于VARCHAR 文本,另一个用于NVARCHAR 文本。通过这种方式,我可以通过仅将 Unicode 文本正文存储在 NVARCHAR 列中并将其余的文本存储在 VARCHAR 列中来节省空间。

问题是:如何检测正文是否包含 Unicode 字符,以便确定存储它的最佳列?

【问题讨论】:

    标签: sql-server unicode


    【解决方案1】:

    您可以确定排序规则的代码页中可用的 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 
    

    顺便说一句:如果您使用行压缩,您还会得到 Unicode 压缩,这在很大程度上消除了对此的需求。

    【讨论】:

    • 使用压缩听起来像是一个更可取的选择,但我相信使用本机 SQL 压缩可以压缩多大的字段是有限制的。我可以使用 SQL CLR 库实现压缩,例如 gzip。
    • @EliPerpinyal 行和页压缩(包括unicode compression)仅适用于存储在行中的数据而非大对象数据。 SQL Server 2016 具有用于 GZIP 压缩的内置 COMPRESS 函数。
    猜你喜欢
    • 2012-05-18
    • 2015-07-27
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多