db2 - 使用 CODEUNITS32 更改表以支持 unicode 行为后,应用程序行为会发生什么变化?
问题描述
我们正处于将一些表从 AS400 DB 迁移到 DB2 LUW(V11.1) 的阶段。迁移时,我们在源数据库 (AS400)-(带有 CHAR 的列)中发现了一些特殊字符 (€),如果我们无法使用 CODEUNITS32、DB2 LUW 数据库配置字节编码设置为 UTF-8 更改表列,则会导致错误.
我们想了解,将 char 列更改为 CODEUNITS32 后应用程序的行为是什么,我是否需要在应用程序级别(C 和 Java 应用程序)更新任何配置以处理字符编码集?
更改为 CODEUNITS32 后 - 我的 C 应用程序能够编译并能够处理字符字节从每字符 8 位(UTF-8)到每字符 4 字节(CODEUNITS32)的变化?- 我的 Java 应用程序能够处理字符字节从每字符 8 位 (UTF-8) 到每字符 4 字节 (CODEUNITS32) 的变化吗?
在将列定义从 CHAR 设置为 CODEUNITS32 并测试成功后,我们通过手动向表中插入特殊字符进行了一些试点测试。
解决方案
对列使用字符串单位规范CODEUNITS32
不会更改列的编码,对于 CHAR/VARCHAR 列,数据仍以 UTF-8 存储。
它将列的物理长度 ( CHAR
) 或最大长度 ( VARCHAR
) 更改为 4 倍。
它还在某些函数中启用“字符语义” ,例如 ,以便它们在处理列SUBSTR()
时处理字符,而不是字节。CODEUNITS32
(SUBSTRING()
将始终使用字符语义(除非处理FOR BIT DATA
列))
所以 a CHAR(4)
isCHAR(4 OCTETS)
有 4 个字节长,如果它们都是 UTF-8 中的单字节,则最多可以容纳 4 个字符。对于 3 字节长的 €,它只能容纳 say€4
而不是€42
A 的CHAR(4 CODEUNTIS32)
长度为 16 个字节,最多可容纳 4 个字符。它可以保持€€€€
但不能€2345
值得考虑避免CHAR(x CODEUNITS32)
和偏爱VARCHAR(x CODEUNITS32)
。UTF-8
对于固定宽度的数据类型并不能很好地发挥作用。更常见的 UTF-8 字符长度为 1 或 2 个字节,因此通常一CHAR(x CODEUNITS32)
列将容纳超过 50% 的空间填充。
CODEUNITS32
表示长度属性的单位是 Unicode UTF-32 代码单位,近似于字符计数。
这个长度单位不影响数据类型的底层代码页。
数据值的实际长度是通过计算 UTF-32 代码单元来确定的,就像数据被转换为 UTF-32 一样。
CODEUNITS32 的字符串单元只能在 Unicode 数据库中使用。
CODEUNITS32 可以根据环境设置明确指定或确定。
另外,出于兴趣,GRAPHIC
/VARGRAPHIC
和列以 UTF-16 存储,默认为CODEUNITS16
,但也可以使用CODEUNITS32
.
推荐阅读
- r - 通过 R 从 XML 中提取数据元素
- elasticsearch - 在 logstash 中使用多个输出时丢失数据
- c# - 如何在 Xamarin 项目中引用 Windows.System 命名空间?
- regex - 使用 grep 正则表达式选择第一个连字符
- scala - 如何在 Spark 中取消透视数据框?
- internet-explorer - IEXPLORE.EXE 是否有任何已知的退出代码?
- excel - Excel:如果数字小于8位,如何在以逗号分隔的数字字符串中添加前导零?
- sql-server - 由于使用 Invoke-SQLCmd 将参数传递给 SQL 文件而导致的错误
- json - Google App Script - 脚本已完成但未返回任何内容且未插入新行
- html - 悬停时,如何覆盖现有的动画样式?