为什么在ibm db2中自动将nchar(2)或nvarchar(10)转换为char(8)/varchar(40)?

lymgl2op  于 2023-04-06  发布在  DB2
关注(0)|答案(2)|浏览(199)

我正在将mssql转换为db2。mssql中的nchar/nvarchar需要在ibm db2中转换nchar/nvarchar。但是,对于dbeaver工具,db2控制台,所有操作都是相同的。我需要将nchar(n)和nvarchar(max)转换为db2数据类型,因为可以接受unicode。
请帮帮我,谢谢。
(我使用的是db2 docker镜像:ibmcom/db2:11.5.6.0a)

disbfnqx

disbfnqx1#

在IBM DB2中,可以使用以下数据类型来表示Unicode字符:

  • VARCHAR(n)-用于可变长度字符串,其中n指定字符串的最大长度(以字节为单位)。
  • VARGRAPHIC(n)-用于可变长度的图形字符串,其中n指定字符串的最大长度(以字节为单位)。
  • CHAR(n)-用于固定长度的字符串,其中n指定字符串的长度(以字节为单位)。
  • GRAPHIC(n)-用于固定长度的图形字符串,其中n指定字符串的字节长度。要将SQL Serverncharnvarchar数据类型转换为IBM DB2数据类型,可以使用以下Map:
  • nchar(n)-〉CHAR(n)CCSID UNICODE
  • nvarchar(n)-〉VARCHAR(n)CCSID UNICODE
  • nvarchar(max)-〉CLOB(2G)CCSID UNICODE

请注意,CCSID(编码字符集标识符)指定用于数据的字符编码,UNICODE表示数据是Unicode格式。
您可以使用DBeaver工具或DB2控制台执行SQL语句来创建新表或使用新数据类型更改现有表。下面是一个示例SQL语句,用于在IBM DB2中创建一个新表,将nvarchar(max)数据类型转换为CLOB(2G)CCSID UNICODE:

CREATE TABLE mytable (
   id INT,
   data CLOB(2G) CCSID UNICODE
);

我希望这有帮助!

mnemlml8

mnemlml82#

对于一个注解来说,它变得太大了,所以我会在@Nuwans的答案中添加一些信息。实际上,它不仅仅是-例如- VARCHAR(n)。我假设你使用的是支持UTF-8的Db2数据库。
VARCHAR(n)的含义取决于db cfg STRING_UNIT。如果它是SYSTEM,则n表示字节数(例如,确定字符串的长度会变得非常麻烦),即使它被指定为SYSTEM,您仍然可以通过将列声明为以下内容来使用多字节字符:

VARCHAR(n CODEUNITS32)

我发现一个旧的信息,指出NVARCHAR(MAX)可以容纳(2 ^ 31 - 1 - 2) / 2 = 1'073'741'822 double-byte characters。我假设这并没有减少,因为它比可以存储在VARCHAR,VARGRAPHIC或CLOB(在CODEUNITS 32中)中的内容更大。请参阅sql-xml-limits,字符串限制部分。在该表中,您还可以找到:

Maximum length of DBCLOB (in double-byte characters or CODEUNITS16) 1,073,741,823

因此,NVARCHAR(MAX)的最佳选择可能是:

DBCLOB(1073741823 CODEUNITS16)

GRAPHIC / VARGRAPHIC在Db2中UTF-8之前就已经存在,作为处理多字节字符的一种方法。

相关问题