sql – LENGTH命令的奇怪行为 – ORACLE
我在这里遇到一个我不明白的一个令人不快的情况.我将要写的功能的文档也没有什么可以照亮这个东西.
我有一个表字段titulo varchar2(55).我在巴西,这个领域的一些角色有口音,我的目标是创建一个没有口音的类似字段(由原来的字符代替,因为这是一个等等). 我可以使用一些功能来替代,翻译和其他功能,但是我通过互联网找到接缝更优雅,然后我使用它.那就是问题所在. 我的更新代码如下: 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) 起初我虽然也许这些功能增添了一些角色,让我检查一下.我做了一个select命令,让我一行,其中titulo有55个字符. select titulo from myTable where length(titulo) = 55 然后我选择一行做一些测试,我选择的行有这个值:’FGHJTóRYODE YHJKS DADGHQ?AAASGA XCVBGLEASDE?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)结果与上述相同 建议@Sebas: > LENGTHB(b)结果是56 那么,再来一次:这个长度(b)= 56来自哪里? 对不起,长期的帖子,谢谢你们谁在这里(阅读所有). 最好的祝福 解决方法‘nlssort’函数的文档不会声明输出字符串将是输入字符串的规范化,或者它们具有相同的长度.该功能的目的是返回可用于对输入字符串进行排序的数据.见http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions113.htm#SQLRF51561 使用它来规范化你的字符串是很诱人的,因为它显然是有效的,但是你在这里赌博 哎,甚至可以产生一个LENGTH(b)= 200,并且仍然在做它应该做的事情:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |