我正在将一些数据库迁移到 UTF-8,并且刚刚发现了我不知道的现象。选择数据到终端时,将额外的字节添加到输出中。例子:
~]$ x=$(db2 -x "values 'a'")
~]$ echo "${x}b"
a b
后一个额外的空格
~]$ x=$(db2 -x "values 'aa'")
echo "${x}b"
aa b
aa 后面的两个额外空格
一个字符在 utf8 中占用多少字节似乎并不重要:
~]$ x=$(db2 -x "values '?'")
~]$ echo "${x}b"
? b
g-谱号后加一个空格
~]$ x=$(db2 -x "values '??'")
~]$ echo "${x}b"
?? b
g-clef 后的两个额外空格 g-clef
数据库配置文件:
Database territory = SE
Database code page = 1208
Database code set = UTF8
Database country/region code = 46
Database collating sequence = SYSTEM_819_SE
终端具有编码 UTF8(尝试过终止符和 gnome-terminal),并且在连接到数据库之前我做了:
export LC_CTYPE=sv_SE.utf8
上面当然只是愚蠢的例子,但我在类似的脚本中有相当多的测试:
dbtype=`db2 -x "values nya.get_db_type()"`
if [ "${dbtype}" = "N" ]; then
...
我需要以一种或另一种方式更改测试的地方。
关于配置的任何想法,可以摆脱额外的字节?
~]$ uname -a
Linux nya-ladok3-release 3.10.0-1062.9.1.el7.x86_64 #1 SMP Mon Dec 2 08:31:54 EST 2019 x86_64 x86_64 x86_64 GNU/Linux
~]$ db2level
DB21085I This instance or install (instance name, where applicable:
"db2inst1") uses "64" bits and DB2 code release "SQL11050" with level
identifier "0601010F".
Informational tokens are "DB2 v11.5.0.0", "s1906101300", "DYN1906101300AMD64",
and Fix Pack "0".
Product is installed at "/opt/ibm/db2/V11.5".
这是我从IBM支持那里得到的解释,我自己没有测试过,但看起来很合理。建议的解决方法适用于我现在能想到的所有情况:
CLP 中填充的额外空格是预期的行为。这是因为有一些多字节字符占用超过 1 个物理空间。请参见下面的示例,该示例演示了相同的内容:
比如说,U+FF2D 全宽拉丁文大写字母 M
如果您在脚本中使用了很多函数,例如 get_db_type(),您可以更改这些函数中的返回值以将其修改为 OCTETS:
类似于以下内容:
我将保留当前的解决方法,如下所示:
如果没有其他任何东西出现,我可能会按照以下方式做一些事情:
一开始,我想:
可以,但是管道引入了一个子shell,所以:
这没用。