我在这里遇到了一个我无法理解的inusited情况。我将要写的函数的文档也没有点亮这件事。
我有一个带字段的表titulo varchar2(55)
。我在巴西,这个字段中的一些字符有口音,我的目标是创建一个没有口音的类似字段(替换为原来的字符á
,a
等等。)。
我可以使用一堆函数来做到这一点replace
,translate
以及其他函数,但我在互联网上找到了一个看起来更优雅的函数,然后我使用它。这就是问题所在。
我的更新代码是这样的:
update myTable
set TITULO_URL = replace(
utl_raw.cast_to_varchar2(
nlssort(titulo, 'nls_sort=binary_ai')
)
,' ','_');
正如我所说,目标是将每个重音字符转换为其等效字符,而没有重音符号加上空格字符_
然后我得到了这个错误:
ORA-12899: value too large for column
"mySchem"."myTable"."TITULO_URL" (actual: 56, maximum: 55)
起初我虽然可能这些功能正在添加一些字符,让我检查一下。我做了一个选择命令让我得到一个titulo
有 55 个字符的行。
select titulo from myTable where length(titulo) = 55
然后我选择一行做一些测试,我选择的行有这个值:('FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD'
我确实改变了一点来保存数据,但结果是一样的)
当我执行以下选择语句时,事情变得很奇怪:
select a, length(a), b, length(b)
from ( select 'FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD' a,
replace(
utl_raw.cast_to_varchar2(
nlssort('FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD', 'nls_sort=binary_ai')
)
,' ','_') b
from dual
)
这个 sql 的结果是(为了更好的可视化,我将把这些值放在一起):
a LENGTH(a)
FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD 55
b LENGTH(b)
fghjtoryo_de_yhjks_da_dghqcaa_de_asga_xcvbgl_easdeonasd 56
比较两个字符串的大小没有区别:
FGHJTÓRYO DE YHJKS DA DGHQÇÃA DE ASGA XCVBGL EASDEÔNASD
fghjtoryo_de_yhjks_da_dghqcaa_de_asga_xcvbgl_easdeonasd
我已经在 Toad、PLSQL Developer 和 SQLPLUSW 上测试了这个查询,结果都一样。所以我的问题是这个 LENGTH(b)=56 来自哪里?我知道它可能与字符集有关,但我不知道为什么。我什至用trim
命令测试过,结果是一样的。
我做的另一个测试
substr(b, 1,55)
结果与上面的文本相同lenght(trim(b))
结果是 56substr(b,56)
结果是空的(没有空,没有空格,只是空的)
@Sebas 建议:
LENGTHB(b)
结果是 56ASCII(substr(b,56))
所以,再一次:这个 LENGTH(b)=56 是从哪里来的?
很抱歉发了这么长的帖子,并感谢那些来到这里的人(阅读所有内容)。感谢那些无论如何不读的人:)
此致