問題ID:19581
- フォーラムは新サイトへ移行しました。
- このフォーラムではゲスト投稿が禁止されています
問題ID:19581
msg# 1
hakamatsu
投稿数: 3
お世話になっております。
Oracle 11g の環境で、題名の問題を試すため下記の SQL を
実行したところ、エラーになります。
select TO_NUMBER('\500,000', 'L999,999') from dual;
*
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。
私の環境の NLS の CURRENCY に関するパラメータは下記の通りです。
SQL> select * from v$nls_parameters where PARAMETER like '%CURRENCY%';
PARAMETER VALUE
------------------------------ --------------------
NLS_CURRENCY \
NLS_ISO_CURRENCY JAPAN
NLS_DUAL_CURRENCY \
あれこれググった限りでは解決に至らず、質問させて頂きます。
よろしくお願いします。
Oracle 11g の環境で、題名の問題を試すため下記の SQL を
実行したところ、エラーになります。
select TO_NUMBER('\500,000', 'L999,999') from dual;
*
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。
私の環境の NLS の CURRENCY に関するパラメータは下記の通りです。
SQL> select * from v$nls_parameters where PARAMETER like '%CURRENCY%';
PARAMETER VALUE
------------------------------ --------------------
NLS_CURRENCY \
NLS_ISO_CURRENCY JAPAN
NLS_DUAL_CURRENCY \
あれこれググった限りでは解決に至らず、質問させて頂きます。
よろしくお願いします。
Re: 問題ID:19581
msg# 1.1
arashi1977
居住地: 広島
投稿数: 1715
hakamatsuさんの環境がわからないので推測でしか無いのですが…
フォントの影響かもしれませんが、エン(¥)サインとバックスラッシュは違いますのでもう一度入力値を確認してみてはいかがでしょうか?
私の手元の環境だとこうなりました。
※投稿本文のエンサインが勝手にバックスラッシュに変換されるみたいなので、わざとエンサインを全角にしています。このまま実行するとORA-01722のエラーになりますのでご注意ください。
フォントの影響かもしれませんが、エン(¥)サインとバックスラッシュは違いますのでもう一度入力値を確認してみてはいかがでしょうか?
私の手元の環境だとこうなりました。
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> select * from v$nls_parameters where PARAMETER like '%CURRENCY%';
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_CURRENCY
¥
NLS_ISO_CURRENCY
JAPAN
NLS_DUAL_CURRENCY
\
SQL> select TO_NUMBER('¥500,000', 'L999,999') from dual;
TO_NUMBER('¥500,000','L999,999')
--------------------------------
500000
SQL> select TO_NUMBER('\500,000', 'L999,999') from dual;
select TO_NUMBER('\500,000', 'L999,999') from dual
*
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。
Re: 問題ID:19581
msg# 1.1.1
hakamatsu
投稿数: 3
情報ありがとうございます。
やはり正常な結果は出力されないようです。
記号(¥)は shift-jis で 0x5c である事は事前に確認済です。
環境の文字コードも(centos 標準の)UTF8 です。
やはり正常な結果は出力されないようです。
記号(¥)は shift-jis で 0x5c である事は事前に確認済です。
環境の文字コードも(centos 標準の)UTF8 です。
[oracle@CentOS3 ~]$ cat /etc/sysconfig/i18n LANG="ja_JP.UTF-8"
[oracle@CentOS3 ~]$ sqlplus pingt/oracle
SQL> col PARAMETER for a30
SQL> col value for a30
SQL> list
1 select * from v$nls_parameters
SQL> /
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE JAPANESE
NLS_TERRITORY JAPAN
NLS_CURRENCY \
NLS_ISO_CURRENCY JAPAN
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT RR-MM-DD
NLS_DATE_LANGUAGE JAPANESE
NLS_CHARACTERSET AL32UTF8
NLS_SORT BINARY
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT RR-MM-DD HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT RR-MM-DD HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY \
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
19行が選択されました。
SQL> select to_number( '\500,000', 'L999,999' ) from dual;
select to_number( '\500,000', 'L999,999' ) from dual
*
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。
Re: 問題ID:19581
msg# 1.1.1.1
arashi1977
居住地: 広島
投稿数: 1715
念のため確認なのですが
1. NLS_CURRENCYとNLS_DUAL_CURRENCYの値は同じですか?
例えばNLS_CURRENCYの値をコピーしても結果は同じですか?
2.
これは
しても結果は同じですか?
そうであれば、
引用:CentOSではUTF8なのにshift-jisの話をされているので、Windows7とかより前の環境からCentOSに繋いで、そこでSQLを入力してるってことですかね?(U+00A5を送れない?)
あと、UTF-8でのバックスラッシュとエンサインの違いについて参考になりそうなURL貼っときます。
http://blog.cognitom.com/post/7615020471/yen-mark
1. NLS_CURRENCYとNLS_DUAL_CURRENCYの値は同じですか?
例えばNLS_CURRENCYの値をコピーしても結果は同じですか?
2.
[oracle@CentOS3 ~]$ cat /etc/sysconfig/i18n LANG="ja_JP.UTF-8"
$ echo $LANG
そうであれば、
引用:
記号(¥)は shift-jis で 0x5c である事は事前に確認済です。
環境の文字コードも(centos 標準の)UTF8 です。
あと、UTF-8でのバックスラッシュとエンサインの違いについて参考になりそうなURL貼っときます。
http://blog.cognitom.com/post/7615020471/yen-mark
Re: 問題ID:19581
msg# 1.1.1.2
quensan
投稿数: 119
私の環境で再現するものとしないものがありました。(どちらもCentOS 6.5)
再現しないものと hakamatsu さんの環境での共通点はNLS_CHARACTERSETが"AL32UTF8"になっていることです。
再現するもの -> Oracle 11g、NLS_CHARACTERSETが"AL32UTF8"
再現しないもの -> Oracle 12c、NLS_CHARACTERSETが"JA16EUC"
NLS_CHARACTERSETはもう変えられないので、とりあえずの対処としてNLS_CURRENCYをCentOSで直接入力した「\」に変えたら、エラーは出なくなりました。
再現しないものと hakamatsu さんの環境での共通点はNLS_CHARACTERSETが"AL32UTF8"になっていることです。
再現するもの -> Oracle 11g、NLS_CHARACTERSETが"AL32UTF8"
再現しないもの -> Oracle 12c、NLS_CHARACTERSETが"JA16EUC"
NLS_CHARACTERSETはもう変えられないので、とりあえずの対処としてNLS_CURRENCYをCentOSで直接入力した「\」に変えたら、エラーは出なくなりました。
SQL> alter session set nls_currency='\';
セッションが変更されました。
SQL> select to_number('\500,000', 'L999,999') from dual;
TO_NUMBER('\500,000','L999,999')
--------------------------------
500000
Re: 問題ID:19581
msg# 1.1.1.2.1
hakamatsu
投稿数: 3
お世話になっております。
arashi1977 さん、quensan さん、情報提供ありがとうございました。
私も自社環境では問題なく実行できていました。
arashi1977 さんご指摘の文字コードで、もしやと思い
quensan さんご指摘の通り NLS_CHARACTERSET を調べたら
やはり AL32UTF8 となっていました。
(自社環境は JA16SJISTILDE でした)
これは変更できないんですね。。
NLS_CURRENCY を直接入力したら問題なく実行できるようになりました。
ありがとうございました。
今回はお二人のお陰でとても勉強になりました。
Bronze 取れるよう、頑張ります!
arashi1977 さん、quensan さん、情報提供ありがとうございました。
私も自社環境では問題なく実行できていました。
arashi1977 さんご指摘の文字コードで、もしやと思い
quensan さんご指摘の通り NLS_CHARACTERSET を調べたら
やはり AL32UTF8 となっていました。
(自社環境は JA16SJISTILDE でした)
これは変更できないんですね。。
NLS_CURRENCY を直接入力したら問題なく実行できるようになりました。
ありがとうございました。
今回はお二人のお陰でとても勉強になりました。
Bronze 取れるよう、頑張ります!
Re: 問題ID:19581
msg# 1.1.1.2.1.1
arashi1977
居住地: 広島
投稿数: 1715
解決したみたいでよかったです
で、変換についてですがとっても大変みたいです。
参考になりそうなものがあったので、URL貼っときます
http://skill-note.net/post-587/
引用:がんばってください!
# 自分もOracleMaster取得してみようかなぁ…
で、変換についてですがとっても大変みたいです。
参考になりそうなものがあったので、URL貼っときます
http://skill-note.net/post-587/
引用:
Bronze 取れるよう、頑張ります!
# 自分もOracleMaster取得してみようかなぁ…