2014-06-17 6 views
0

일부 독일어 단어는 "ß"문자를 포함합니다.SQLite 독일어 특수 문자

그러나 때때로 사람들은 "ss"라고 쓰고 그 반대도 마찬가지입니다. 완벽하게 합법적 인 것은 아니지만 이는 일반적인 관행입니다.

예를 들어 어떤 사람들은 "auer"라고 쓰고 어떤 사람들은 "ausser"라고 씁니다.

나는 이것을 SQLite DB에서 훌륭하게 처리하고 싶습니다.

그러므로 나는 사용자 정의 LATIN_NOCASE 조합을 만들었습니다,하지만 예상대로 작동하지 않습니다 :

나는 "außer"라는 단어를 삽입하고, 내가 "를 검색하면 수 있도록하고 싶습니다 s "또는"ss ".

그러나 내 선택은 결과를 반환하지 않습니다.

어디서 잘못 본 사람이 있습니까? 아래와 같은 비교가 충분합니까? 아니면 추가로 특별한 조치를 취해야합니까?

감사합니다.

Imports System.Data.SQLite 
Imports System.Globalization 

<SQLiteFunction(FuncType:=FunctionType.Collation, Name:="LATIN_NOCASE")> _ 
Public Class SQLiteCaseInsensitiveCollation 
    Inherits SQLiteFunction 

    Private Shared ReadOnly _cultureInfo As CultureInfo = CultureInfo.CreateSpecificCulture("de-DE") 

    Public Overrides Function Compare(x As String, y As String) As Integer 
     Return String.Compare(x, y, _cultureInfo, CompareOptions.IgnoreCase) 
    End Function 

End Class 

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 

     SQLiteFunction.RegisterFunction(GetType(SQLiteCaseInsensitiveCollation)) 

     Dim c As New SQLite.SQLiteConnection("Data source=:memory:") 
     c.Open() 

     Using nCmd As SQLite.SQLiteCommand = c.CreateCommand 
      With nCmd 
       .CommandText = "CREATE TABLE foo (word TEXT COLLATE LATIN_NOCASE)" 
       .ExecuteNonQuery() 
      End With 
     End Using 

     Using nCmd As SQLite.SQLiteCommand = c.CreateCommand 
      With nCmd 
       .CommandText = "CREATE INDEX 'idx_foo_word' ON 'foo' (word COLLATE LATIN_NOCASE)" 
       .ExecuteNonQuery() 
      End With 
     End Using 

     Using nCmd As SQLite.SQLiteCommand = c.CreateCommand 
      With nCmd 
       .CommandText = "INSERT INTO foo (word) VALUES ('außer')" 
       .ExecuteNonQuery() 
      End With 
     End Using 

     Using nCmdSel As SQLite.SQLiteCommand = c.CreateCommand 
      With nCmdSel 
       .CommandText = "SELECT * FROM foo WHERE word LIKE '%ss%' COLLATE LATIN_NOCASE" 

       Using r As SQLite.SQLiteDataReader = .ExecuteReader 
        Do While r.Read 
         MsgBox(r("word")) 
        Loop 
       End Using 
      End With 
     End Using 

    End Sub 
End Class 
+0

SQLite가 'LIKE'표현식과 데이터 정렬을 지원하는지/사용하는지 전혀 모르겠습니다. 그걸 확인하고 싶을 수도 있습니다. - 그리고 어떤 일반적인 상황에서도 "ß"는 어쨌든 독일어로 "s"로 변환됩니다. – JimmyB

답변

0

문화 de-DE는 SS와 ß의 차이를 무시하지 않습니다.

비교하기 전에 문자열을 직접 수정해야합니다.