<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3934311</guid>
        <pubDate>Fri, 09 Jan 2026 08:54:10 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3934311</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=386692&view=findpost&p=3919247'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Aroyl &#064; <time class="tag-quote__quoted-time" datetime="2025-03-15T09:40:45+03:00">15.03.25, 06:40</time></span><div class='quote '>Заменил в коде указанные фрагменты, при попытке скомпилировать sqlite.dll получил ошибку:<br>
sqlite3.lo : error LNK2019: ссылка на неразрешенный внешний символ __imp_CharUpperW в функции upperFunc.<br>
sqlite3.lo : error LNK2019: ссылка на неразрешенный внешний символ __imp_CharLowerW в функции lowerFunc.<br>
</div></div><br>
Понимаю, что автор давно не заходил ... и тем не менее. Если компиляция прошла успешно (а тут она прошла успешно), значит не хватает при-линкуемой либы, которая реализует используемые функции. В данном случае нужно линковать с либой winuser.]]></description>
        <author>Majestio</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3919247</guid>
        <pubDate>Sat, 15 Mar 2025 06:40:45 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3919247</link>
        <description><![CDATA[Aroyl: Заменил в коде указанные фрагменты, при попытке скомпилировать sqlite.dll получил ошибку:<br>sqlite3.lo : error LNK2019: ссылка на неразрешенный внешний символ __imp_CharUpperW в функции upperFunc.<br>sqlite3.lo : error LNK2019: ссылка на неразрешенный внешний символ __imp_CharLowerW в функции lowerFunc.<br><br>Компилировал по инструкции с сайта SQLITE.ORG через MSVC 2022.<br><br>Я новичок, это моя первая попытка, хотелось бы понять, что я делаю не так]]></description>
        <author>Aroyl</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3911581</guid>
        <pubDate>Mon, 14 Oct 2024 22:53:33 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3911581</link>
        <description><![CDATA[Faster: <strong class='tag-b'>mitrich</strong>, Благодарю вас за решение&#33; <br>
Воткнулся в эту проблему уже начав изучать исходник, и вдруг наткнулся на ваш пост, в общем на 3.46.1 решение работает, единственное что вот этой части нет:<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=386692&view=findpost&p=3411154'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>mitrich &#064; <time class="tag-quote__quoted-time" datetime="2014-02-06T16:51:04+00:00">06.02.14, 16:51</time></span><div class='quote '>Патчим функции LIKE и GLOB - тут очень просто:<br>
Ищем<br>
<br>
# define GlobUpperToLower(A)   if( &#33;((A)&amp;~0x7f) ){ A = sqlite3UpperToLower[A]; }<br>
<br>
и меняем на<br>
<br>
# define GlobUpperToLower(A)   if( &#33;((A)&amp;~0x7f) ){ A = sqlite3UpperToLower[A]; } else { A = CharLowerW((LPWSTR)(A &amp; 0xFFFF)); }<br>
<br>
Примечание: в ранних версиях SQLite 3, данный дефайн почему-то называется GlogUpperToLower</div></div><br>
<br>
без него так же все работает без нареканий, в общем респект уважуха и тому подобное &#33;]]></description>
        <author>Faster</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3626957</guid>
        <pubDate>Mon, 28 Sep 2015 18:42:42 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3626957</link>
        <description><![CDATA[sova: Помогите с sqlite.dll для последних релизов sqlite-dll-win32-x86-3.08.11.01]]></description>
        <author>sova</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3572073</guid>
        <pubDate>Mon, 09 Feb 2015 08:36:49 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3572073</link>
        <description><![CDATA[mitrich: Вроде так (буду дома, посмотрю точнее):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">gcc -o sqlite3.dll -shared -O2 -DSQLITE_ENABLE_FTS4</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>mitrich</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3568721</guid>
        <pubDate>Thu, 29 Jan 2015 07:08:56 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3568721</link>
        <description><![CDATA[kronic: <strong class='tag-b'>mitrich</strong><br>
Можешь написать подробно, чем и как компилил sqlite.]]></description>
        <author>kronic</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3539743</guid>
        <pubDate>Thu, 30 Oct 2014 12:32:26 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3539743</link>
        <description><![CDATA[mitrich: Действительно, в версии 3.8.7 переделали функцию <strong class='tag-b'>patternCompare</strong> и дефайн <strong class='tag-b'>GlobUpperToLower</strong> больше не используется. А вот <strong class='tag-b'>upperFunc</strong>, <strong class='tag-b'>lowerFunc</strong> и <strong class='tag-b'>nocaseCollatingFunc</strong> остались такими же. <br>
Чуть позже выложу патч для последней версии SQLite.]]></description>
        <author>mitrich</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3539550</guid>
        <pubDate>Thu, 30 Oct 2014 06:30:26 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3539550</link>
        <description><![CDATA[credo: Спасибо, НО для версии 3.8.7 этот патч не подходит, да и код в функциях отличается от 3.8.3, очень прошу сделать такой патч для версии 3.8.7, с описанием где что менять.]]></description>
        <author>credo</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3483335</guid>
        <pubDate>Mon, 26 May 2014 11:42:51 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3483335</link>
        <description><![CDATA[mitrich: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=386692&view=findpost&p=3482631'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>DriveSoft &#064; <time class="tag-quote__quoted-time" datetime="2014-05-23T23:36:15+00:00">23.05.14, 23:36</time></span><div class='quote '>Я правильно понимаю, что ICU по умолчанию всегда присутствует в Windows ?</div></div><br>
Как раз таки она по умолчанию в Windows всегда отсутствует.]]></description>
        <author>mitrich</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3482631</guid>
        <pubDate>Fri, 23 May 2014 23:36:15 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3482631</link>
        <description><![CDATA[DriveSoft: Спасибо огромное за скомпиленный dll, а то днем с огнем не сыщешь )<br><br>Я правильно понимаю, что ICU по умолчанию всегда присутствует в Windows ?]]></description>
        <author>DriveSoft</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3411154</guid>
        <pubDate>Thu, 06 Feb 2014 16:51:04 +0000</pubDate>
        <title>SQLite и Unicode без ICU</title>
        <link>https://forum.sources.ru/index.php?showtopic=386692&amp;view=findpost&amp;p=3411154</link>
        <description><![CDATA[mitrich: В движке БД SQLite функции <strong class='tag-b'>UPPER</strong>, <strong class='tag-b'>LOWER</strong>, <strong class='tag-b'>LIKE</strong> и <strong class='tag-b'>GLOB</strong> по умолчанию работают только с латинским алфавитом. Для того, чтобы обеспечить нормальную их работу с юникодными символами, SQLite можно собрать с поддержкой библиотеки <a class='tag-url' href='http://site.icu-project.org/' target='_blank'>ICU</a> (дефайн SQLITE_ENABLE_ICU). Однако, для систем где по умолчанию нет ICU это добавляет пару лишних десятков мегабайт, что может быть неприемлемо для компактных утилит и использовании в различных embedded-системах. Так, как в WinAPI (и других API/фрэймворках) есть свои функции для работы со строками, можно использовать их.<br>
Ниже привожу описание своего простенького windows-only патча:<br>
<br>
Патчим работу SQL-функций <strong class='tag-b'>UPPER</strong> и <strong class='tag-b'>LOWER</strong> - за них отвечают <strong class='tag-b'>upperFunc</strong> и <strong class='tag-b'>lowerFunc</strong>: <ul class="tag-list"><li>так, как они теперь работают с юникодом, то меняем вызовы sqlite3_value_text/sqlite3_value_bytes/sqlite3_result_text на аналогичные, но с цифрой <strong class='tag-b'>16</strong> в конце.</li><li>вставляем вызовы CharUpperW/CharLowerW<strong class='tag-b'>*</strong></li></ul><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){</div><div class="code_line">&nbsp;&nbsp;char *z1;</div><div class="code_line">&nbsp;&nbsp;const char *z2;</div><div class="code_line">&nbsp;&nbsp;int i, n;</div><div class="code_line">&nbsp;&nbsp;UNUSED_PARAMETER(argc);</div><div class="code_line">&nbsp;&nbsp;z2 = (char*)sqlite3_value_text16(argv[0]);</div><div class="code_line">&nbsp;&nbsp;n = sqlite3_value_bytes16(argv[0]);</div><div class="code_line">&nbsp;&nbsp;/* Verify that the call to _bytes() does not invalidate the _text() pointer */</div><div class="code_line">&nbsp;&nbsp;assert( z2==(char*)sqlite3_value_text16(argv[0]) );</div><div class="code_line">&nbsp;&nbsp;if( z2 ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;z1 = contextMalloc(context, ((i64)n)+1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if( z1 ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;memcpy(z1, z2, n);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CharUpperW((LPWSTR)z1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sqlite3_result_text16(context, z1, n, sqlite3_free);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){</div><div class="code_line">&nbsp;&nbsp;char *z1;</div><div class="code_line">&nbsp;&nbsp;const char *z2;</div><div class="code_line">&nbsp;&nbsp;int i, n;</div><div class="code_line">&nbsp;&nbsp;UNUSED_PARAMETER(argc);</div><div class="code_line">&nbsp;&nbsp;z2 = (char*)sqlite3_value_text16(argv[0]);</div><div class="code_line">&nbsp;&nbsp;n = sqlite3_value_bytes16(argv[0]);</div><div class="code_line">&nbsp;&nbsp;/* Verify that the call to _bytes() does not invalidate the _text() pointer */</div><div class="code_line">&nbsp;&nbsp;assert( z2==(char*)sqlite3_value_text16(argv[0]) );</div><div class="code_line">&nbsp;&nbsp;if( z2 ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;z1 = contextMalloc(context, ((i64)n)+1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if( z1 ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;memcpy(z1, z2, n);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CharLowerW((LPWSTR)z1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sqlite3_result_text16(context, z1, n, sqlite3_free);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<strong class='tag-b'>*Примечание:</strong> В WinAPI функции CharUpperW/CharLowerW работают как с одиночными символами, так и с целыми строками, в зависимости от того, что им передается - 2-байтный символ или указатель на строку (который будет больше 0xffff).<br>
<br>
Патчим функции <strong class='tag-b'>LIKE</strong> и <strong class='tag-b'>GLOB</strong> - тут очень просто:<br>
Ищем<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line"># define GlobUpperToLower(A) &nbsp; if( !((A)&amp;~0x7f) ){ A = sqlite3UpperToLower[A]; }</div></ol></div></div></div></div><br>
и меняем на<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line"># define GlobUpperToLower(A) &nbsp; if( !((A)&amp;~0x7f) ){ A = sqlite3UpperToLower[A]; } else { A = CharLowerW((LPWSTR)(A &amp; 0xFFFF)); }</div></ol></div></div></div></div><br>
<strong class='tag-b'>Примечание:</strong> в ранних версиях SQLite 3, данный дефайн почему-то называется Glo<strong class='tag-b'>g</strong>UpperToLower<br>
<br>
Осталось сделать <strong class='tag-b'>COLLATE NOCASE</strong> - правим <strong class='tag-b'>nocaseCollatingFunc</strong>:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">static int nocaseCollatingFunc(</div><div class="code_line">&nbsp;&nbsp;void *NotUsed,</div><div class="code_line">&nbsp;&nbsp;int nKey1, const void *pKey1,</div><div class="code_line">&nbsp;&nbsp;int nKey2, const void *pKey2</div><div class="code_line">){</div><div class="code_line">&nbsp;&nbsp;int r = CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, pKey1, -1, pKey2, -1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;switch(r)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp;case CSTR_LESS_THAN &nbsp; : return -1;</div><div class="code_line">&nbsp;&nbsp;case CSTR_EQUAL &nbsp; &nbsp; &nbsp; : return &nbsp;0;</div><div class="code_line">&nbsp;&nbsp;case CSTR_GREATER_THAN: return &nbsp;1;</div><div class="code_line">&nbsp;&nbsp;default &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : return &nbsp;0;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Так, как теперь <strong class='tag-b'>nocaseCollatingFunc</strong> работает с юникодными строками, ищем место, где она регистрируется и исправляем:<br>
меняем<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/* Also add a UTF-8 case-insensitive collation sequence. */</div><div class="code_line">createCollation(db, &quot;NOCASE&quot;, SQLITE_UTF8, 0, nocaseCollatingFunc, 0);</div></ol></div></div></div></div><br>
на<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/* Also add a UTF-16 case-insensitive collation sequence. */</div><div class="code_line">createCollation(db, &quot;NOCASE&quot;, SQLITE_UTF16, 0, nocaseCollatingFunc, 0);</div></ol></div></div></div></div><br>
<br>
По такому же принципу можно пропатчить SQLite для использования не только с WinAPI, но и с другими API - нам только нужны юникодные функции для:<ul class="tag-list"><li>перевода символа/строки в верхний/нижний регистр</li><li>сравнения двух строк</li></ul><br>
По ссылке можно скачать измененный исходник для версии 3.8.3 и собранную dll.<br>
<a class='tag-url' href='https://drive.google.com/file/d/0Bzw1xBVt0mokZDVxR1lpMzFKQUU/edit?usp=sharing' target='_blank'>https://drive.google.com/file/d/0Bzw1xBVt0m...dit?usp=sharing</a><br>
В аттаче diff для той же версии 3.8.3<br>
<span class="b-attach" data-size="2332" data-hits="656" data-attach-id="36121" data-attach-post-id="3411154">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3411154&amp;attach_id=36121' title='Скачать файл' target='_blank'>sqlite3.c.3_8_3.diff</a> (, : 656)
		</span>]]></description>
        <author>mitrich</author>
        <category>Базы данных: SQL</category>
      </item>
	
      </channel>
      </rss>
	