Что это за невидимый символ в SQLite? - PullRequest
0 голосов
/ 09 октября 2018

Вот тестовый пример:

sqlite> SELECT DISTINCT quote(meta_sheet_name), length(meta_sheet_name)
   ...>   FROM calendar.data calendar_tasks
   ...>   WHERE calendar_tasks.meta_sheet_name LIKE "%Tasks"
   ...> ;  
quote(meta_sheet_name)|length(meta_sheet_name)
'Tasks'|5

sqlite> SELECT DISTINCT quote(meta_sheet_name), length(meta_sheet_name)
   ...>   FROM calendar.data calendar_tasks
   ...>   WHERE calendar_tasks.meta_sheet_name LIKE "Tasks%"
   ...> ;  
quote(meta_sheet_name)|length(meta_sheet_name)
'Tasks'|5

sqlite> SELECT DISTINCT quote(meta_sheet_name), length(meta_sheet_name)
   ...>   FROM calendar.data calendar_tasks
   ...>   WHERE calendar_tasks.meta_sheet_name LIKE "Tasks"
   ...> ;  
sqlite> 

По некоторым причинам последний запрос не возвращает строку, а другие возвращают.Вот документация SQLite для оператора SELECT https://sqlite.org/lang_select.html, и я не смог найти ничего более конкретного, описывающего использование LIKE.


Дополнительная информация об отладке:

SQLite версия 3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668

Объяснить планы запросов

sqlite> EXPLAIN QUERY PLAN SELECT DISTINCT quote(meta_sheet_name), length(meta_sheet_name)
   ...>   FROM calendar.data calendar_tasks
   ...>   WHERE calendar_tasks.meta_sheet_name LIKE "%Tasks"
   ...> ;  
selectid|order|from|detail
0|0|0|SCAN TABLE data AS calendar_tasks USING COVERING INDEX data_index (~500000 rows)
0|0|0|USE TEMP B-TREE FOR DISTINCT

sqlite> EXPLAIN QUERY PLAN SELECT DISTINCT quote(meta_sheet_name), length(meta_sheet_name)
   ...>   FROM calendar.data calendar_tasks
   ...>   WHERE calendar_tasks.meta_sheet_name LIKE "Tasks%"
   ...> ;  
selectid|order|from|detail
0|0|0|SCAN TABLE data AS calendar_tasks USING COVERING INDEX data_index (~500000 rows)
0|0|0|USE TEMP B-TREE FOR DISTINCT

sqlite> EXPLAIN QUERY PLAN SELECT DISTINCT quote(meta_sheet_name), length(meta_sheet_name)
   ...>   FROM calendar.data calendar_tasks
   ...>   WHERE calendar_tasks.meta_sheet_name LIKE "Tasks"
   ...> ;  
selectid|order|from|detail
0|0|0|SCAN TABLE data AS calendar_tasks (~500000 rows)
0|0|0|USE TEMP B-TREE FOR DISTINCT

Объясняет

sqlite> EXPLAIN SELECT DISTINCT quote(meta_sheet_name), length(meta_sheet_name)
   ...>   FROM calendar.data calendar_tasks
   ...>   WHERE calendar_tasks.meta_sheet_name LIKE "%Tasks"
   ...> ;  
addr|opcode|p1|p2|p3|p4|p5|comment
0|Trace|0|0|0||00|
1|OpenEphemeral|1|0|0|keyinfo(2,BINARY,BINARY)|08|
2|Goto|0|20|0||00|
3|OpenRead|2|3|2|keyinfo(3,BINARY,BINARY)|00|
4|Rewind|2|18|1|0|00|
5|String8|0|2|0|%Tasks|00|
6|Column|2|1|3||00|
7|Function|1|2|1|like(2)|02|
8|IfNot|1|17|1||00|
9|Column|2|1|2||00|
10|Function|0|2|4|quote(1)|01|
11|Column|2|1|3||40|
12|Function|0|3|5|length(1)|01|
13|Found|1|17|4|2|00|
14|MakeRecord|4|2|1||00|
15|IdxInsert|1|1|0||00|
16|ResultRow|4|2|0||00|
17|Next|2|5|0||01|
18|Close|2|0|0||00|
19|Halt|0|0|0||00|
20|Transaction|2|0|0||00|
21|VerifyCookie|2|37|0||00|
22|TableLock|2|2|0|data|00|
23|Goto|0|3|0||00|

sqlite> EXPLAIN SELECT DISTINCT quote(meta_sheet_name), length(meta_sheet_name)
   ...>   FROM calendar.data calendar_tasks
   ...>   WHERE calendar_tasks.meta_sheet_name LIKE "Tasks%"
   ...> ;  
addr|opcode|p1|p2|p3|p4|p5|comment
0|Trace|0|0|0||00|
1|OpenEphemeral|1|0|0|keyinfo(2,BINARY,BINARY)|08|
2|Goto|0|20|0||00|
3|OpenRead|2|3|2|keyinfo(3,BINARY,BINARY)|00|
4|Rewind|2|18|1|0|00|
5|String8|0|2|0|Tasks%|00|
6|Column|2|1|3||00|
7|Function|1|2|1|like(2)|02|
8|IfNot|1|17|1||00|
9|Column|2|1|2||00|
10|Function|0|2|4|quote(1)|01|
11|Column|2|1|3||40|
12|Function|0|3|5|length(1)|01|
13|Found|1|17|4|2|00|
14|MakeRecord|4|2|1||00|
15|IdxInsert|1|1|0||00|
16|ResultRow|4|2|0||00|
17|Next|2|5|0||01|
18|Close|2|0|0||00|
19|Halt|0|0|0||00|
20|Transaction|2|0|0||00|
21|VerifyCookie|2|37|0||00|
22|TableLock|2|2|0|data|00|
23|Goto|0|3|0||00|

sqlite> EXPLAIN SELECT DISTINCT quote(meta_sheet_name), length(meta_sheet_name)
   ...>   FROM calendar.data calendar_tasks
   ...>   WHERE calendar_tasks.meta_sheet_name LIKE "Tasks"
   ...> ;  
addr|opcode|p1|p2|p3|p4|p5|comment
0|Trace|0|0|0||00|
1|OpenEphemeral|1|0|0|keyinfo(2,BINARY,BINARY)|08|
2|Goto|0|20|0||00|
3|OpenRead|0|2|2|38|00|
4|Rewind|0|18|0||00|
5|Column|0|37|2||00|
6|Column|0|1|3||00|
7|Function|0|2|1|like(2)|02|
8|IfNot|1|17|1||00|
9|Column|0|1|2||00|
10|Function|0|2|4|quote(1)|01|
11|Column|0|1|3||40|
12|Function|0|3|5|length(1)|01|
13|Found|1|17|4|2|00|
14|MakeRecord|4|2|1||00|
15|IdxInsert|1|1|0||00|
16|ResultRow|4|2|0||00|
17|Next|0|5|0||01|
18|Close|0|0|0||00|
19|Halt|0|0|0||00|
20|Transaction|2|0|0||00|
21|VerifyCookie|2|37|0||00|
22|TableLock|2|2|0|data|00|
23|Goto|0|3|0||00|

1 Ответ

0 голосов
/ 10 октября 2018

В случае, если вы действительно хотите узнать, что на самом деле происходит с точки зрения SQLite, используйте следующую команду

sqlite> .show

В этом списке перечислены все настройки по умолчанию для соответствующей базы данных

       echo: off
        eqp: off
    explain: auto
    headers: off
       mode: list
  nullvalue: ""      /* This setting is set to empty string */
    output: stdout
colseparator: "|"
rowseparator: "\n"
    stats: off
    width: 

На самом деле nullvalue установлено пустым, поэтому вы увидите все нулевые значения в виде пустой строки

nullvalue: ""

В случае, если вы хотите увидеть любой другой символ вместо пустой строки, то вы можете использовать следующий способ, чтобы установить его.Но это будет временно, пока вы не выйдете из базы данных.

Вы можете установить его следующим образом:

.nullvalue NULL

Теперь он начнет показывать пустые строки в виде NULL, аналогично MySql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...