gpt4 book ai didi

sql - LENGTH 命令的奇怪行为 - ORACLE

转载 作者:行者123 更新时间:2023-12-04 02:23:09 24 4
gpt4 key购买 nike

我在这里遇到了一个我无法理解的使用不当的情况。我将要写的函数的文档也不能说明这一点。

我有一个带有字段的表 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))结果是 56
  • substr(b,56)结果是空的(没有空,没有空格,只是空的)

  • @Sebas 建议:
  • LENGTHB(b)结果是 56
  • ASCII(substr(b,56))

  • 所以,再次: 这个 LENGTH(b)=56 从哪里来 ?

    很抱歉这篇长文章,并感谢那些来到这里的人(阅读所有内容)。
    感谢那些无论如何都没有阅读的人:)

    此致

    最佳答案

    'nlssort' 函数的文档没有说明输出字符串将是输入字符串的规范化,或者它们将具有相同的长度。该函数的目的是返回可用于对输入字符串进行排序的数据。

    http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions113.htm#SQLRF51561

    使用它来规范你的字符串很诱人,因为它显然有效,但你在这里赌博......

    哎呀,它甚至可以产生 长度(b)=200 并且仍然在做它应该做的:)

    关于sql - LENGTH 命令的奇怪行为 - ORACLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19774073/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com