Как использовать строковые литералы не-ascii в выражениях firebird sql?

После прочтения всех комментариев и ответов я собираюсь объяснить оптимальное решение этой проблемы. Лучшим вариантом является решение @ rik, поэтому мое улучшение основывается на его.

Вместо того, чтобы задавать каждый FragmentClass, как

if(FragmentClass1){
   ...
if(FragmentClass2){
   ...
}

Создайте свой собственный интерфейс и создайте его дочерние фрагменты, например

public interface MyChildFragment {
    void updateView(int position);
}

Затем вы можете сделать что-то подобное, чтобы инициировать и обновлять внутренние фрагменты.

Fragment childFragment = (Fragment) mViewPagerDetailsAdapter.instantiateItem(mViewPager,mViewPager.getCurrentItem());

if (childFragment != null) {
   ((MyChildFragment) childFragment).updateView();
}

PS Будьте осторожны, когда вы вставляете этот код, если вы вызываете insatiateItem до того, как система действительно создаст его, savedInstanceState вашего дочернего фрагмента будет пустым для него

public void onCreate(@Nullable Bundle savedInstanceState){
      super(savedInstanceState)
}

Сбой вашего приложения.

Удачи

1
задан Tomay 17 January 2019 в 18:44
поделиться

3 ответа

Firebird использует набор символов соединения, чтобы знать, как нужно кодировать строковые значения. По умолчанию установлено значение NONE, что означает, что преобразование набора символов не применяется, и точное поведение зависит от инструмента / клиента, но в целом клиенты применяют набор символов системы по умолчанию для преобразования между байтовыми значениями и строками.

Вам необходимо указать набор символов подключения UTF8 при подключении из FlameRobin, и ваш запрос будет работать

SELECT NAME FROM TABLE1 WHERE NAME = 'العربية'

Если вы не укажете набор символов подключения, тогда набор символов подключения NONE применяется, и в результате значения строк будут интерпретироваться в кодировке платформы по умолчанию (которая в Windows - не utf8, а, например, windows-1252).

0
ответ дан Mark Rotteveel 17 January 2019 в 18:44
поделиться

Не используйте литералы. Не помещайте данные в текст запроса, поместите их вне запроса как «параметры».

Он имеет ряд преимуществ, таких как более надежный синтаксический анализ, большая проверка типов, большая безопасность и часто более высокая скорость (вы можете подготовить запрос один раз, а затем многократно выполнять его, только изменяя значение параметров).

Способ кодирования параметров в запросах SQL зависит от библиотеки, которую вы используете в своем языке программирования для подключения к Firebird. См. http://bobby-tables.com/ для некоторых примеров. Ниже приведены три часто используемых соглашения:

  • SELECT NAME FROM TABLE1 WHERE NAME = ? - изначально поддерживается Firebird, доступ к параметрам на основе индекса
  • SELECT NAME FROM TABLE1 WHERE NAME = :NAME_PARAM - стиль BDE / Delphi
  • SELECT NAME FROM TABLE1 WHERE NAME = @NAME_PARAM - стиль MS SQL / .Net

Я не знаю, какие разновидности поддерживаются в Flame Robin и Maestro. IB Expert использует библиотеки Delphi, поэтому использует параметр # 2. Программы, написанные на Java, как правило, используют опцию № 1.

0
ответ дан Arioch 'The 17 January 2019 в 18:44
поделиться

Для соединений ADO.NET включайте" Charset=UTF8" (по умолчанию "НИ ОДИН") в строке подключения. Как в:

"User=SYSDBA; Password=masterkey; Database=SampleDatabase.fdb; DataSource=localhost; Port=3050; Dialect=3; Charset=UTF8; Роль =; Соединение lifetime=15; Pooling=true; MinPoolSize=0; MaxPoolSize=50; Пакет Size=8192; ServerType=0";

0
ответ дан Cristi S. 8 April 2019 в 08:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: