복붙노트

[RUBY-ON-RAILS] 어떻게 지정된 로케일에 sqlite3를 텍스트를 정렬하려면?

RUBY-ON-RAILS

어떻게 지정된 로케일에 sqlite3를 텍스트를 정렬하려면?

기본적으로 sqlite3를 아스키 문자 만 정렬합니다. 나는 구글에보고했지만, 내가 찾은 유일한 데이터 정렬에 대한 정보했다. sqlite3를 단지 NOCASE, RTRIM 및 BIARY 데이터 정렬이 있습니다. 어떻게 특정 로케일에 대한 지원을 추가하려면? (나는 레일 응용 프로그램에서 사용하고 있습니다)

해결법

  1. ==============================

    1.SQLite는은 ICU와의 통합을 지원합니다. 추가 정보 파일에 따르면, SQLite는 / 내선 / ICU / README.txt 파일 SQLite는 / 내선 / ICU / 디렉토리는 SQLite는 대한 소스 코드를 포함 "ICU"확장 SQLite는과 "국제 부품 유니 코드"라이브러리의 통합.

    SQLite는은 ICU와의 통합을 지원합니다. 추가 정보 파일에 따르면, SQLite는 / 내선 / ICU / README.txt 파일 SQLite는 / 내선 / ICU / 디렉토리는 SQLite는 대한 소스 코드를 포함 "ICU"확장 SQLite는과 "국제 부품 유니 코드"라이브러리의 통합.

    1. Features
    
        1.1  SQL Scalars upper() and lower()
        1.2  Unicode Aware LIKE Operator
        1.3  ICU Collation Sequences
        1.4  SQL REGEXP Operator
    
  2. ==============================

    2.나는 더그 커리의 대답을 받아,하지만 난 sqlite3를 문서는 아주 이상한 때문에 (적어도 나를 위해), 그것을 어떻게 일부 "알고리즘"을 추가하고 싶습니다.

    나는 더그 커리의 대답을 받아,하지만 난 sqlite3를 문서는 아주 이상한 때문에 (적어도 나를 위해), 그것을 어떻게 일부 "알고리즘"을 추가하고 싶습니다.

    좋아, 우리는 지금 sqlite3를하고 작업 한 :

  3. ==============================

    3.당신은 ICU 확장을 컴파일 할 여유가없는 경우 당신은 UDF가 동일한 작업을 수행 할 수 있습니다. PHP / PDO의 경우 :

    당신은 ICU 확장을 컴파일 할 여유가없는 경우 당신은 UDF가 동일한 작업을 수행 할 수 있습니다. PHP / PDO의 경우 :

    $pdo->sqliteCreateFunction('locale',
        function ($data, $locale = 'root')
        {
            static $collators = array();
    
            if (isset($collators[$locale]) !== true)
            {
                $collators[$locale] = new \Collator($locale);
            }
    
            return $collators[$locale]->getSortKey($data);
        }
    );
    

    사용 예제 :

    SELECT * FROM "table" ORDER BY locale("column", 'pt_PT');
    

    나는이 방법은 기본 확장으로 효율적 것으로 기대하지 않습니다하지만 확실히 더 휴대용입니다.

  4. ==============================

    4.더그 커리 대답으로 주문 악센트 문자가 올바르게 SQLite는 "ICU"확장자를로드하여 사용할 수 있습니다

    더그 커리 대답으로 주문 악센트 문자가 올바르게 SQLite는 "ICU"확장자를로드하여 사용할 수 있습니다

    여기 kiew 자신의 대답에 설명 된대로 확장 요구는, 컴파일합니다. 그러나, ICU의 readme 파일과 kiew의 대답에 주어진 라이브러리 이름은 나를 위해 작동하지 않았다. 이 다른 대답 대신 libicu.so 이름을 사용 제안했다.

    이 그래서 스트레치 우분투 16.04에 데비안 9.8에 나를 위해 일한 것입니다 :

    sudo apt install libicu-dev libsqlite3-dev dpkg-dev gcc make
    apt-get source sqlite3
    cd sqlite3-*/ext/icu       # assuming you have only 1 sqlite3 source directory
    gcc -shared icu.c `icu-config --ldflags` -fPIC -o libicu.so
    sudo cp libicu.so /usr/local/lib/
    sudo ldconfig
    

    sqlite3를에 그 후, 당신은 할 수

    .load libicu
    SELECT icu_load_collation('', 'ICU');
    

    icu_load_collation에 2 인자는 로케일 및 사용자 정의 이름입니다. 로케일은 선택 될 것으로 보인다 빈 남아있을 수 있습니다. 사용자 정의 이름을 가진 후 볼 수 있습니다

    PRAGMA collation_list;
    

    그리고는 같이 사용할 수 있습니다

    SELECT col FROM tbl ORDER BY col COLLATE ICU;
    
  5. from https://stackoverflow.com/questions/611459/how-to-sort-text-in-sqlite3-with-specified-locale by cc-by-sa and MIT license