質問するログイン新規登録
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

解決済

1回答

1434閲覧

sqliteで日本語を含んだ文字列の中から19バイト目以降を取得するには?

yasseima

総合スコア11

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

0グッド

0クリップ

投稿2019/07/12 01:42

編集2019/07/12 01:58

0

0

前提・実現したいこと

c#を使ってsqliteを呼び出しています。
日本語を含んだ文字列の中から、19バイト目から16バイトを取得したいと思っています。

発生している問題・エラーメッセージ

ZNAKAには、「 東京 ジュース 0.5L」があるとします。 下記のSQL文だと「 東京」でパターンマッチング検索を行った後に19バイト目以降を取得したいのですが、「ース 0.5L」となってしまいます。 先頭から18バイトまでの間に日本語が含まれているためだと思うのですが、日本語を含んだ文字列の中で「ジュース 0.5L」を取得するには、どのようにしたらよいでしょうか。

該当のソースコード

SELECT SUBSTR(ZNAKA, 19, 16), SU FROM Zaiko WHERE ZNAKA LIKE (' 東京%') ;

試したこと

oracleにはSUBSTRBという機能があるようなのですが、sqliteには内容だというところマテは調べたところです。

補足情報(FW/ツールのバージョンなど)

NuGetを使って「System.Data.SQLite 1.0.111.0」を使用しています。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/12 01:55

C# のタグが付いていますが、質問を見る限り SQLite の SELECT クエリの書き方の問題だけで、C# は関係ないように見えます。そうであれば C# のタグは外してください。
yasseima

2019/07/12 01:58

ご指摘、ありがりがとうございます。 修正いたしました。
fuzzball

2019/07/12 02:07

そもそも半角文字は1バイトなんですか?
yasseima

2019/07/12 02:21 編集

元々使っておられたのがDelphiで固定長、半角・全角で出力しているものというものでしたので、半角文字を1バイトとして考えています。半角19文字目という方がよろしいでしょうか。
fuzzball

2019/07/12 02:23

SQLite内部の話です。仮にSQLite内部で2バイト扱いだったとしたら、どうしようもないですよね。
yasseima

2019/07/12 02:56

勉強不足ですみません。 SQLiteでどのように文字が扱わられるのかがわかっておりません。 どのように調べたらいいでしょうか。
fuzzball

2019/07/12 03:04

hex(SUBSTR(ZNAKA, 19, 16)) でどんな出力になりますか?
yasseima

2019/07/12 03:15

ありがりがとうございます。 SELECT hex(SUBSTR(ZNAKA, 19, 16)), SU FROM Zaiko WHERE ZNAKA LIKE (' 東京%') ; とした場合、 E383BCE382B9E38080302E354C と返ってきました。
退会済みユーザー

退会済みユーザー

2019/07/12 03:31

> E383BCE382B9E38080302E354C と返ってきました。 UTF-8 のようですね。それなのに「19バイト目から16バイト」とバイトで指定するのはどういう訳でしょう?
guest

回答1

0

ベストアンサー

E383BCE382B9E38080302E354C と返ってきました。

UTF-8 のようですね。それなのに「19バイト目から16バイト」とバイトで指定するのはどういう訳でしょう? 意味がなさそうですが。

日本語を含んだ文字列の中で「ジュース 0.5L」を取得するには、どのようにしたらよいでしょうか。

バイト数で指定する意味が分かりませんが、「ジュース 0.5L」を取得するには文字数で指定、即ち 'ジ' は最初の文字(質問者さんの例では半角空白)から数えて 17 文字目なので SUBSTR(ZNAKA, 17, 16) とすればよさそうですが。

UTF-8 では ASCII 文字(質問者さんの例で言うと半角空白や 0.5L)は 1 バイトですが、日本語(質問者さんの例で言うと全角空白や '東' '京' 'ジ' 'ュ' 'ー' 'ス')は 3 バイトになります。

投稿2019/07/12 03:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasseima

2019/07/12 04:53

ありがりがとうございます。 UTF-8の場合、全角・半角→2バイト・1バイトではなく、3バイトになるということですね。 基本的なことだったかと思いますが、お付き合いいただきましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問