【问题标题】:Avoiding code change with Microsoft SQLServer and Unicode使用 Microsoft SQLServer 和 Unicode 避免代码更改
【发布时间】:2010-09-15 02:14:43
【问题描述】:

如何让 MSSQL 服务器默认接受 Unicode 数据到 VARCHAR 或 NVARCHAR 列中?

我知道您可以通过在要放置在字段中的字符串前面放置一个 N 来做到这一点,但老实说,这在 2008 年似乎有点过时,尤其是在使用 SQL Server 2005 时。

【问题讨论】:

    标签: sql-server unicode data-migration


    【解决方案1】:

    N 语法是您在 SQL Server 中指定 unicode 字符串文字的方式。

    N'Unicode string'
    'ANSI string'
    

    如果可能,SQL Server 将使用列的排序规则或数据库的排序规则在两者之间自动转换。

    因此,如果您的字符串文字实际上不包含 unicode 字符,则无需指定 N 前缀。

    但如果您的字符串文字 确实 包含 unicode 字符,则必须使用 N 前缀。

    【讨论】:

      【解决方案2】:

      如果这是一个 Web 应用程序,您可能会让您的 Web 服务器使用 UTF8 作为默认编码。这样,所有往返于浏览器的数据都是 UTF8,可以插入到 VARCHAR 字段中。 UTF8 是让不了解 Unicode 的应用程序处理它的好方法。

      【讨论】:

        【解决方案3】:

        他们确实需要一种方法来关闭对 ​​N'' 前缀的需求。 “向后兼容需要它”参数对我来说是零意义 - 当然,将该行为作为旧应用程序的默认行为,但为我提供默认打开 Unicode 字符串的选项(即,不需要 N'' 前缀。)我发现我需要去弄乱我的应用程序的大部分区域以适应 SQL Server 上的 Unicode,而这在 Oracle 和 Postgresql 中不是问题。来吧,微软!

        【讨论】:

          【解决方案4】:

          虽然您可以简单地将 UTF8 内容存储在 MSSQL Server 的 VARCHAR 字段中,但前提是未完成字符集转换,但您应该注意:

          1. 您的应用程序之外的任何管理/报告/数据工具都无法理解您的非英语字符。

          2. 特定语言的处理(例如对名称列表进行排序)可能不会按照每种语言可接受的顺序进行。

          3. 必须小心数据截断。截断多字节 UTF8 字符通常会导致相关字符的数据损坏。如果输入超过字段长度,您应该始终拒绝输入。

          4. 禁用字符集转换可能不像您想象的那么简单。即使您在客户端驱动程序中将其关闭,如果客户端和 RDBMS 之间存在显着的区域设置差异,在某些情况下仍可以覆盖它使用的代码页会立即导致数据损坏。

          5. 如果您认为这就是全部,您将不得不担心自己会自欺欺人。

          总而言之,虽然您可能很想走这条路,但它不是一个好主意。多字节时需要更改代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-05-10
            • 2021-05-22
            • 1970-01-01
            • 2021-03-10
            • 2014-07-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多