【问题标题】:Difference between CHAR & NCHAR in database WITH UTF-8 collationWITH UTF-8 排序规则数据库中 CHAR 和 NCHAR 的区别
【发布时间】:2019-07-02 18:30:02
【问题描述】:

在 SAP SQL Anywhere(其中数据类型和大多数结构与 SQL Server 非常相似)中,默认数据库排序规则设置为 UTF-8 - 详细设置如下:

我有一组特殊字符,数据库需要存储和使用它们(范围:U+1400 - U+167F),并且在测试后插入 VARCHARNVARCHAR数据类型能够容纳这些特殊字符而没有明显差异(分配的空间除外) - 见下文:

当 DB 排序规则设置为 UTF-8(使用 UTF8BIN 字符集)CHAR/VARCHAR 数据类型默认能够存储 UTF-8 字符集和NCHAR/NVARCHAR UTF-16 时,我是否理解正确?意思是,如果我只需要 UTF-8 范围:U+1400 - U+167F,我不必将所有 CHAR/VARCHAR 对象转换为 NCHAR/NVARCHAR

【问题讨论】:

  • 注意:UTF-8 和 UTF-16 是字符 编码,两者都适用于 Unicode 字符 set 中的全部代码点。术语“字符集”通常表示字符编码。

标签: sql-server utf-8 sqlanywhere


【解决方案1】:

回答我自己的问题:

是的,UTF-8 排序规则中的 CHAR 和 VARCHAR 将存储所有字符,但数据类型长度规范会有所不同。定义 varchar 长度时,例如:VARCHAR(100) 我们期望 100 个字符的字符串限制。这仅适用于 1char = 1byte (ASCII) 的字符,对于所有 UTF-8 字符(2-4bytes),数字将指定字节长度,例如:VARCHAR(100) 将只能包含 UTF-8 字符串4 字节 UTF-8 文本的长度为 25 个字符。

请随时纠正我或改进我的答案。

【讨论】:

  • 实际上不是字节,而是 UTF-8 代码单元,每个单元一个字节。同样,UTF-16 数据类型计算 UTF-16 代码单元。 (NVARCHAR(100) 最多可存储 50 到 100 个 Unicode 代码点)。
猜你喜欢
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 2012-06-29
  • 2012-09-12
  • 2014-12-13
  • 2012-09-14
  • 2011-12-08
  • 1970-01-01
相关资源
最近更新 更多