照合シーケンス。ロケール固有の文字列比較。
成果物
前提
SQLite3を用意する。
ICU
を有効にする。静的・動的どちらでもいい。
API
icu.cのコメントに使い方が書いてあった。
SQL関数 | 概要 |
---|---|
A LIKE B |
LIKE 句 |
contains(zPattern, zString) |
含まれているか否か |
regexp(zPattern, zString) |
正規表現 |
lower('I'), lower('I', 'en_us') |
小文字化 |
upper('i'), upper('i', 'en_us') |
大文字化 |
icu_load_collation('jp_JP','japanese') |
collation設定 |
regexp()
select regexp('[\d]+[\w]+[\d]+', '12abc34');
1
select regexp('[\d]+[\d]+', '12abc34');
0
指定した正規表現に一致していたら1
、そうでないなら0
を返す。
contains()
begin transaction; create table myTable(myColumn text); insert into myTable values('e'); insert into myTable values('é'); insert into myTable values('è'); insert into myTable values('é'); insert into myTable values('ê'); insert into myTable values('ë'); insert into myTable values('E'); insert into myTable values('Ê'); insert into myTable values('É'); commit; select * from myTable where contains ('e', myColumn);
e é è ê ë E Ê É
icu_load_collation()
select icu_load_collation('ja_JP','japanese'); select 1 collate japanese;
create table posts(title text); insert into posts values('は'); insert into posts values('ハ'); insert into posts values('ハ'); insert into posts values('バ'); insert into posts values('バ'); insert into posts values('ぱ'); insert into posts values('パ'); insert into posts values('パ');
select * from posts where title='パ' collate japanese;
パ
select * from posts where title='パ' collate japanese;
ぱ パ
select * from posts where title='ぱ' collate japanese;
ぱ パ
ぱ
とパ
を同一とみなした。collate
を外すと以下のように異なるものとみなす。
select * from posts where title='パ';
パ
collate
したときの期待値が違う。パ
とパ
を同じとみなして欲しかった。
パ パ
半角カタカナが厄介者。こいつを全角カタカナと比較させて一致したいのに……。ふつうの要件はこれではないだろうか……。
以下も同じ。
insert into posts values('アパート'); insert into posts values('アパート'); insert into posts values('㌀'); select * from posts where title='アパート'
アパート
全件出て欲しいのに……。
like
句を使っても同じ。
select * from posts where title like 'アパート';
アパート
解決方法は不明。以下でなんとかなるのか? 関係ない?
lower()
, upper()
select lower('A');
a
select upper('a');
A
ひらがなやカタカナでは変化なし。
select lower('あ'); select upper('あ'); select lower('ア'); select upper('ア'); select lower('ア'); select upper('ア'); select lower('あ', 'ja_JP'); select upper('あ', 'ja_JP'); select lower('ア', 'ja_JP'); select upper('ア', 'ja_JP'); select lower('ア', 'ja_JP'); select upper('ア', 'ja_JP'); select lower('あ', 'japanese'); select upper('あ', 'japanese'); select lower('ア', 'japanese'); select upper('ア', 'japanese'); select lower('ア', 'japanese'); select upper('ア', 'japanese');
期待値としては半角カタカナと全角カタカナを相互変換して欲しかった。
情報源
- https://www.sqlite.org/src/artifact?ci=trunk&filename=ext/icu/README.txt
- https://stackoverflow.com/questions/6578600/how-to-compile-sqlite-with-icu
- https://github.com/seblucas/sqlite-enhanced-icu
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- SQLite 3.29.0
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux
前回まで
- SQLite3学習をはじめよう
- SQLite3学習 SQLiteについて
- SQLite3学習 SQLiteの適切な用途
- SQLite3学習 SQLiteの特徴
- SQLite3学習 SQLiteのクセ
- SQLite3学習 データ型とアフィニティ
- SQLite3学習 演算子の一覧
- SQLite3学習 よくある質問
- SQLite3学習 SQLiteダウンロード&コンパイル
- SQLite3学習 Tclで操作する
- SQLite3学習 ビルドオプション動作確認(SQLITE_ALLOW_URI_AUTHORITY)
- SQLite3学習 面白そうなコンパイルオプション
- SQLite3学習 SQLiteの拡張について
- SQLite3学習 JSON拡張
- SQLite3学習 JSON拡張(json_extract)
- SQLite3学習 JSON拡張(json_each)
- SQLite3学習 JSON拡張(json_tree オブジェクト→行)
- SQLite3学習 JSON拡張(json_tree オブジェクトツリー→行)
- SQLite3学習 JSON拡張(json_tree オブジェクト配列→行)
- SQLite3学習 JSON拡張(json_group_array 行→配列)
- SQLite3学習 JSON拡張(json_group_object 行→オブジェクト)
- SQLite3学習 JSON拡張(json_array_length)
- SQLite3学習 JSON拡張(json_type)
- SQLite3学習 JSON拡張(json_valid)
- SQLite3学習 JSON拡張(json_quote)
- SQLite3学習 JSON拡張(json_array)
- SQLite3学習 JSON拡張(json_object)
- SQLite3学習 JSON拡張(json_patch)
- SQLite3学習 JSON拡張(json_insert)
- SQLite3学習 JSON拡張(json_replace)
- SQLite3学習 JSON拡張(json_set)
- SQLite3学習 JSON拡張(json_remove)
- SQLite3学習 全文検索(FTS5)
- SQLite3学習 全文検索FTSを日本語で使う方法を調べてみた
- 形態素解析MeCabをインストールする
- SQLite3学習 全文検索FTS5のMeCab用トークナイザを実装する
- SQLite3学習 FTS5+MeCabでクエリ構文
- SQLite3学習 FTS5のテーブル作成と初期化
- SQLite3学習 FTS5の補助関数
- SQLite3学習 FTS5のfts5vocab仮想テーブル
- SQLite3学習 再帰クエリ(WITH RECURSIVE)
- SQLite3学習 R-Treeモジュール
- SQLite3学習 ファイル入出力(SQL集計)
- SQLite3学習 拡張関数(generate_series)
- SQLite3謎 主キーの型をintにするとinsertで値を省略したらNULLになってしまう
- SQLite3学習 入出力関数(fsdir, readfile, writefile, edit)
- SQLite3ビルド コンパイルオプションを付与する方法(CFLAGS等))
- SQLite3 コンパイルオプション確認方法(pragma compile_options)
- SQLite3ビルド ICUを有効にする(SQLITE_ENABLE_ICU)
- SQLite3拡張 ICUを動的ロードする