编写国际 Transact-SQL 语句

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统(PDW)Microsoft Fabric中的SQL数据库

如果遵循以下指导原则,则使用 Transact-SQL 语句的数据库和数据库应用程序将变得更易于在语言之间移植,或者将支持多种语言:

  • 自 SQL Server 2019 (15.x) 起以及在 Azure SQL 数据库中,使用以下任一值:

    • 启用了 UTF-8 排序规则的 charvarcharvarchar(max) 数据类型中的数据使用 UTF-8 编码。
    • 采用启用了补充字符 (SC) 的排序规则的 ncharnvarcharnvarchar(max) 数据类型,且数据使用 UTF-16 编码。 使用非 SC 排序规则会导致使用 UCS-2 对数据进行编码。

    这避免了代码页转换问题。 有关其他注意事项,请参阅 UTF-8 与 UTF-16 的存储差异

  • 到 SQL Server 2017 (14.x) 为止,将 charvarcharvarchar(max) 数据类型的所有使用替换为 ncharnvarcharnvarchar(max)。 如果使用已启用增补字符 (SC) 的排序规则,则使用 UTF-16 对数据进行编码。 使用非 SC 排序规则会导致使用 UCS-2 对数据进行编码。 这避免了代码页转换问题。 有关详细信息,请参阅排序规则和 Unicode 支持

    重要

    text 数据类型已弃用,不应在新的开发工作中使用此数据类型。 计划将 text 数据转换为 varchar(max)

  • 在进行月份和星期几的比较与运算时,请使用日期的数字部分,而不要使用名称字符串。 不同的语言设置返回的月份和工作日的名称也不同。 例如,当语言设置为美国英语时,DATENAME(MONTH,GETDATE()) 返回 May,而当语言设置为德语时,返回 Mai,语言设置为法语时则返回 mai。 应使用以数字而非名称表示月份的函数,如 DATEPART。 在生成显示给用户的结果集时,请使用 DATEPART 名称,因为日期名称通常比数值表示形式更有意义。 但是,不要编写任何依赖于显示名称为特定语言的逻辑。

  • 在比较中指定日期或输入 INSERT 或 UPDATE 语句时,对所有语言设置使用相同的解释常量:

    • ADO、OLE DB 和 ODBC 应用程序应使用下列 ODBC 时间戳、日期和时间转义子句:

      { ts'yyyy-mm-ddhh:mm:ss [.fff] '},例如:{ ts'1998-09-24 10:02:20'}

      { d'yyyy-mm-dd'} 例如:{ d'1998-09-24'}

      { t'hh:mm:ss'} 例如:{ t'10:02:20'}

    • 使用其他 API 的应用程序或 Transact-SQL 脚本、存储过程和触发器都应使用未分隔数值字符串。 例如 yyyymmdd 为 19980924。

    • 使用其他 API 的应用程序,以及 Transact-SQL 脚本、存储过程和触发器,在 timedatesmalldatedatetimedatetime2datetimeoffset 数据类型与字符字符串数据类型之间进行所有转换时,都应使用带显式样式参数的 CONVERT 语句。 例如,以下语句对于所有语言或日期格式连接设置的解释方式都相同:

      SELECT *  
      FROM AdventureWorks2022.Sales.SalesOrderHeader  
      WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)  
      

另请参阅

CAST 和 CONVERT (Transact-SQL)
DATEPART (Transact-SQL)
排序规则和 Unicode 支持