Perl+DBI+PostgreSQLでCGIを作っているのですが、Shift-JIS固有の字を扱いたいので、
SET CLIENT_ENCODING TO 'SJIS';
としたのですが、特定の文字列でSQL文がエラーになります。
例えば「ソ」を
$str = $dbh->quote( 'ソ' );
とすると、$strは「'ソ\'」になるのですが、これをSQL文中で使用すると、
DBD::Pg::st execute failed: ERROR: unterminated quoted string at or near "'ソ\' )" at character 124
となってしまいます。
どうやら「2バイト目が5Ch(半角の\)の全角文字」+「\」+「'」と言う組み合わせの時だけエラーになるようです。
ちなみにWindows上のMySQLでは「'ソ\'」で問題ありませんでした。
これはどのように対処すればよろしいのでしょうか?
OSはRed Hat Enterprise Linux ES release 3 (Taroon Update 4) カーネル 2.4.21-4.EL
DBはPostgreSQL 7.4.7です。
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
試しに当方の環境で試してみましたが「濱」をInsertしてHTMLで表示という流れは問題ありませんでした。
当然WHERE句に指定しても問題ありませんでした。
データベースのEncodeはEUCでHTMLはS-JISです。
SJIS表示できるターミナルでも試したのですが、最初ターミナルをEUC表示でSET CLIENT_ENCODING TO 'SJIS';を行い、ターミナルをSJIS表示に切り替えINSERTおよびSELECTしてみましたが問題ありませんでした。ターミナル上でも同様の現象が発生しますか?
この回答への補足
検証ありがとうございます。
SJISターミナルにおいてもやはり「'ソ\'」はエラーでした。「濱」の異体字(ウ冠と貝の間がちょっと違う)や「崎」の異体字(大の所が立になっている)といった文字自体そのものは問題ないのですが、それらの文字を扱う為にShift-JISにしたところ、別の「ソ」「表」「能」といった2バイト目が5Chの文字とシングルクォートの組み合わせがエラーになってしまうのです。
ちなみにこのOKWeb(教えてgoo)もこれらの文字は入力出来ないみたいですね。
Web上ではあまり歓迎されていないのでしょうか…。
No.2
- 回答日時:
違うかもしれませんが・・・
データベースのEncodeがSQL_ASCIIになってませんか?
前に似たようなことになったことがあるのですがSQL_ASCIIだと
SET CLIENT_ENCODING TO 'SJIS';
を行ってもSJISにはなりません。
その時はEUCに変換するプログラムを作って新たなデータベース(EUC)を作成して対応しました。
この回答への補足
アドバイス、どうもありがとうございました。
「psql -l」で見た所、EncodingはEUC_JPになっていました。
Shift-JISにしたいのは、人名でEUCにはない漢字を扱いたいからなのですが(「濱」や「崎」の異体形)、こういう苗字の人には我慢してもらうしかないのでしょうか…。あと、私の場合はこの環境でしか検証出来ないのですが、この現象がここだけなのか、他のDB環境でも再現されるものなのかが気になります。
引き続き自分でも色々調べています。
No.1
- 回答日時:
そもそもこの場合は「ソ」をquoteに掛ける必要がないでしょう。
ダブルクォートで括っている場合は展開されてしまうために「ソ」の2バイト目が\であるため文字化けしてしまいますが、シングルクォートで括った場合は展開されないので文字化けが起きません。
今回の場合、「ソ\」で2バイト目の\とquoteで付加された\で\\と続いてしまっているために打ち消されて\ひとつになってしまいエラーの原因になっていると思われます。
(Perlでは\\は文字としての\を表します)
この回答への補足
早速のアドバイス、どうもありがとうございます。
非常に役に立ちました。
ただ、文字列をSQL文内にセットする時にquoteを通さないのはあまり現実的でないような気がします。
例えばファイルを1行づづ読み込んでDBに挿入するのはよくある事だと思うのですが、1行目が「\」、2行目が「ソ」だった場合、前者はquoteを通さないとエラーになり、後者は通すとエラーになります。
通すか通さないかを判断するには文字列のバイトイメージをいちいち解析しなければならず、quote後はそれぞれ「'\\'」「'ソ\'」16進で(27 5C 5C 27) (27 83 5C 5C 27)になりますが、単に「\\'」の並びではエラーにならず、あくまで最初の「\」が「全角文字の2バイト目」の時に限ってエラーになります。
ですから「ソセ」→「'ソ\セ'」(27 83 5C 5C 83 5A 27)のように「\」と「'」が離れている時はうまく行きます。
私としては、「\\'」において1番目の「\」が単体の時は「\\」の方が「\'」よりも優先順位が高く、全角後半の時は「\\」よりも「\'」の方が高い為にこのようになってしまうのかな?とも思ったのですが。
ちなみにPerlはシングルクォートで囲む場合でも、クォートの直前に5Chが来る全角文字では「'ソ'」ではなく「'ソ\'」としないとエラーになりました。
私も自分で色々調べているのですが、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- Excel(エクセル) EXCELの「接続」のSQLのコマンド文字列にて、セルから任意の数値を利用したい 2 2023/03/09 16:43
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- マウス・キーボード macからリモートデスクトップでwindowsに接続した際のキーボード配列 3 2023/07/10 08:40
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Excel(エクセル) エクセル 関数について質問です。 2 2022/10/03 11:14
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SJISのDBは作れますか?
-
文字エンコーディングをEUC_JP...
-
PostgreSQLの再インストールに...
-
PostgreSQLについて教えてくだ...
-
PostgreSQLのpsqlでユーザの扱...
-
postgresのdatabase名と、そのe...
-
ディスク上のサイズの乖離が大...
-
ヤフーショッピングでPayPay支...
-
oracle spool SJIS → UTF-8
-
Query OK, 0 rows affected
-
Windows版 pg_dumpの結果をログ...
-
ACCESSのフォームだけを起動す...
-
Windows上のPostgreSQLの完全削...
-
ACCESS VBA;コマンドボックス...
-
pg_restoreでエラー
-
クラスタと冗長化の違いって何...
-
複数カラムを跨いだCOUNTができ...
-
ファイルに記述されている複数...
-
fortranで文字列と数値が混在し...
-
CSVファイルをBULK INSERTでSQL...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PostgreSQLについて教えてくだ...
-
SJISのDBは作れますか?
-
createdbでいきなりつまづいて...
-
quoteした文字列を使ったSQL文...
-
\\copyコマンドでのCSV取り込み...
-
PL/pgSQL 引数の数
-
ログイン履歴
-
PostgresSQLの環境設定について
-
DBで大文字小文字を区別せずINS...
-
PostgreSQLの再インストールに...
-
☆☆DB名の変更☆☆
-
PostgresSQLを使って、出退勤管...
-
WIN版のpostgress...
-
保守にVACUUMは必要か?
-
postgresのdatabase名と、そのe...
-
データベースが異なるテーブル...
-
シフトJISでのDB再構築
-
RDBとRDBMSの違いは何!?
-
文字エンコーディングをEUC_JP...
-
PostgreSQLのpsqlでユーザの扱...
おすすめ情報