当value length = n但lentgthb = x * n时,将varchar2(n char)大小减小为varchar2(n)

时间:2015-07-17 08:24:49

标签: sql oracle oracle11g

我有一张桌子:

CREATE TABLE test_val (
  name VARCHAR2(10 CHAR) NOT NULL
); 

假设我插入以下内容:

INSERT INTO TEST_VAL (name) VALUES('££££££££££'); --data here may be variable characters string so size may vary from 10 to 40 bytes

现在表中的值是10个字符,但是20个字节。

并说我想将列的大小减小到10个字节,我不关心数据丢失。 我做了以下事情:

UPDATE test_val SET name = substr(name,1,10) WHERE lengthb(name)>10;

ALTER TABLE test_val
MODIFY name varchar2(10);

我收到错误,列中的值太大,因为substr(name,1,10)会留下10个符号。

所以我的问题是:是否有一个 substr 替代方法,可以将值子串到字节数,如果没有,是否有另一种方法来减少列值,以便我可以运行alter table?

由于

2 个答案:

答案 0 :(得分:1)

substrb function以字节为单位计算(以及substrcsubstr2substr4以获取多个Unicode字符,UCS2和UCS4代码点)。如果你的数据库字符集是AL32UTF8,请记住字符可能需要1到4个字节的存储空间 - 我不知道如果你试图从一个字节获取10个字节的数据会发生什么字符串,当它会切断中间的一个字符。

答案 1 :(得分:0)

您可以尝试使用substrb -

UPDATE test_val SET name = substrb(name,1,10) WHERE lengthb(name)>10;