• 締切済み

plpgsqlでのbyte数指定での文字切り出し

postgresql(plpgsql)にて、byte数指定での文字列切り出しを行いたいのですが、よい手法などありませんか? substr(substring)だと、文字数の指定となり、対象がマルチバイト、シングルバイト文字混在だと意図した値が取得できません。 ※Oracleのsubstrbに相当するものです。 ※select substr(カラム, 1, 20) from ...的な取得がしたいです。 よろしくお願いします。

みんなの回答

  • f_user
  • ベストアンサー率33% (1/3)
回答No.1

マルチバイト項目をシングルバイト項目にキャストすればよいと思います。 以下のSQLで試してみよう。 --- SELECT nickname ,substring(nickname ,1,5) ,substring(nickname::bytea ,1,5) FROM data; --- nicknameには、動作比較のためにシングルバイト文字列とマルチバイト文字列を入れてください。 --- 123456789 あかさたな --- utf8で作ったDBに上記の2行を入れたとすると --- 12345,12345 あかさたな,"\343\201\202\343\201" --- と表示されると思います。 SQL文ですが、plpgsqlでも使えるかと。 利用するバージョンの明記がありませんが、8系列以降であれは大丈夫だと思います。 ※最低限利用するバージョンは書こうね

関連するQ&A

  • 日本語文字列の指定長(byte)切出し

    以下は日本語文字列(EUC)の指定長(byte)切出し関数なのですが、 これをShift-JIS版にするにはどうすれば良いのでしょうか? ================================================================ sub jcut { # 日本語文字列(EUC)の指定長(byte)切出し local($string, $length) = @_; if (substr($string,$length-1,1) =~ /[\x80-\xff]/) { $length++; } return substr($string, 0, $length); } ================================================================ 宜しくお願い致します。

  • 全角半角あわせて3文字

    全角半角が混在している文字列の左から3文字を取得したい場合にいい方法はないでしょうか? mb_substr関数で第3パラメータはバイト数で指定するようです。 関数リファレンスでは「最大文字数」って表現になってます。 http://php.net/manual/ja/function.mb-substr.php 半角なら文字数=バイト数ですが、全角だと指定の半分の文字数になります。 最大だから間違ってはないですが、文字数じゃないよな‥‥っていつも思ってます。 いったん半角→全角にして、6バイト分を切り出すのはできます。 でも、英数字も全角半角混在してるので元の文字列を壊したくないのです。 mb_substrの第3パラメータを6から3まで、mb_strlenが3になるまで回すのもやってみました。 でも、なんかスマートじゃないんですよ‥‥。 なにかこう、スマートないい手はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • String型をbyte型へ

    MACアドレス(16進数) 00:00:00:00:00:01 これが引数で指定される。 String str = args[0]; というものがありまして(String型)、 そのコロン:で分けられた数字部分のみをバイト配列に格納したいのですが、そのうまい方法がわかりません。お助けください。 byte mac_addr[0] = Byte.parseByte("0x".concat(str.substring(0,1))); なんて事もしてみましたが、NumberForamtExceptionが 表示されます。(コンパイルは出来る。) うむ、分からない。どこが悪いのだろう??? 以上

    • ベストアンサー
    • Java
  • 文字列の取得

    string.subString()のなどで文字列を指定文字数分取得する場合に、バイト数指定で取得する方法ってありますか? 教えてください。

    • ベストアンサー
    • Java
  • 文字列取得 substrではできません。

    1バイト2バイト混在文字列を substrで取得すると、2バイト文字が半分になるため最終文字が文字化けします。 1、2バイト混在文字をうまく取得できる関数はありますか?

    • ベストアンサー
    • PHP
  • byte数について

    日本語だと全角→2バイト 半角→1バイト なはずですが、文字を入力していくと合計byte数が小数点になると 聞いたことがあります。 ※つまりは、120.5byteとかになることがあるということです この情報が本当なのか、本当の場合、どういったケースで小数点が 生じるのかご存知の方いらっしゃいましたらご解答をお願い致します。

  • バイト数の取得について

    Byteについて初心者なもので、詳しく教えて頂けませんか? 例)文字列:String str = "123あいう"; 5文字取得したい場合、     str.subString(0,5) ・・・ "123あい" と取得されますが、 5バイト取得("123あ")の場合、どのようにコーディングすればよろしいのでしょうか?

    • ベストアンサー
    • Java
  • 空文字の扱いについて

    Oracle⇒postgresqlへ移行を行っています。 Oracleでは [カラム名] IS NULL で空文字のデータとNULLのデータを取得できましたが、postgresqlではNULLのデータのみしか取得することができません。 一応 [カラム名] IS NULL OR [カラム名] = '' で、取得できるのですが、修正量、パフォーマンスの問題から、異なった方法を探しています。何か良い方法はありますでしょうか。 宜しくお願いします。 ---以下環境--- RedHat 3 postgresql 8.1 PHP 4.3.11 adodb pear

  • awkでバイト数を方法

    文字列$2を300文字まで切り取る方法は substr($2,1,300)ですが、 全角半角が混在している文字列を 先頭から300バイト取得する方法が分かりません。 お手数をおかけしますが、 ご教授願いします。

  • BYTEの配列の扱いについて

    すみません、BYTEを初めて利用している者なのですが、 文字列の描画で BYTE* ptr = new BYTE[20480]; と宣言した中に、 GetGlyphOutline() で取得した文字の画像を、1文字ずつ &ptr[0]  &ptr[2000]  &ptr[4000]  &ptr[6000] ・・・ と2000毎に文字を入れ、書き出す時もそうしているのですが、 1文字目はキレイに描画できるのですが、2文字目以降が崩れてしまいます。 変なループが起きたり、文字毎に下に隙間が等倍で増えていく感じです。 これはBYTEの使い方を誤っていて、無理な使い方をしているのでしょうか? また、以前の質問でバイトも配列?が使えると聞いたのですが、 BYTE* ptr = new BYTE[1048 * 10]; これは BYTE* ptr = new BYTE[10480];  これと全く同じ物という意味なのでしょうか?