>

내가 시도하는 것 :  -elixir에서 erlang-odbc로 선택하고 모든 결과를 콘솔에 덤프하십시오.

환경 : 내 편

  • Red Hat Enterprise Linux Server 릴리스 7.6 (Maipo)
  • unixODBC 개발 (yum)
  • Elixir 1.8.2 (Erlang/OTP 20으로 컴파일)
  • Erlang/OTP 21
  • erlang-odbc R16B (yum)
  • (또는 둘 다) mssql 드라이버
  • (또는) FreeTds 드라이버 1.1.6 (소스에서 --unixodbc로 컴파일)

타겟

  • MSSQL Server 2016

    CREATE TABLE db_name.dbo.rating (
        [Year] int NULL,
        Code varchar(256) COLLATE Cyrillic_General_CI_AS NULL,
        Name nvarchar(4000) COLLATE Cyrillic_General_CI_AS NULL,
        GroupeCode varchar(256) COLLATE Cyrillic_General_CI_AS NULL,
        GroupeName nvarchar(4000) COLLATE Cyrillic_General_CI_AS NULL,
        Cost numeric(38,5) NOT NULL,
        PrchasesCount int NULL
        ) GO

nvarchar:     character_set_name : 유니 코드     collation_name : Cyrillic_General_CI_AS

varchar:     character_set_name :cp1251     collation_name : Cyrillic_General_CI_AS

엘릭서 코드는 다음과 같습니다 :

conn_str = 
    "SERVER=XX.XX.XX.XX,1433;" <>
     #tried this too! "DRIVER={ODBC Driver 17 for SQL Server};" <>
    "DRIVER=FreeTDS;" <>
    "DATABASE=db_name;UID=bot;PWD=XXXXXX;" 
|> to_charlist
 statement = "select top(3) Name from Rating order by Cost desc" |> to_charlist
 {:ok, pid}=:odbc.connect(conn_str,[])
 {:selected, col_names, rows} = :odbc.sql_query(pid, statement)

그리고 모든 시도 후에 결과가 이와 같습니다

{:selected, ['Name'],
 [
   {<<32, 4, 48, 4, 49, 4, 62, 4, 66, 4, 75, 4, 32, 0, 65, 4, 66, 4, 64, 4, 62,
      4, 56, 4, 66, 4, 53, 4, 59, 4, 76, 4, 61, 4, 75, 4, 53, 4, 32, 0, 63, 4,
      62, 4, 32, ...>>},
   {<<16, 4, 64, 4, 53, 4, 61, 4, 52, 4, 48, 4, 32, 0, 63, 4, 48, 4, 65, 4, 65,
      4, 48, 4, 54, 4, 56, 4, 64, 4, 65, 4, 58, 4, 62, 4, 51, 4, 62, 4, 32, 0,
      66, 4, ...>>},
   {<<35, 4, 65, 4, 59, 4, 67, 4, 51, 4, 56, 4, 32, 0, 63, 4, 62, 4, 32, 0, 64,
      4, 53, 4, 58, 4, 67, 4, 59, 4, 76, 4, 66, 4, 56, 4, 50, 4, 48, 4, 70, 4,
      56, ...>>}
 ]}

올바른 키릴 문자 대신

임의의 숫자가 아닙니다! 결과는 항상 같습니다.

MS 드라이버는 FreeTDS와 동일한 결과를 제공합니다

내가 시도한 것

  • conn 옵션 변경 binary_strings : : on/off
  • 설정 옵션 클라이언트 문자 세트 = freetds.conf의 UTF-8 (전역 섹션)
  • 머리를 긁다
  • : unicode 함수를 사용하여<<데이터 >>
  • 읽기
  • 수신 된 번호에 is_binary ()를 사용하면 true가 반환됩니다

질문

  • 어떤 유형의 데이터를 받습니까?
  • 데이터가 올바르게 디코딩되지 않은 이유는 무엇입니까?
  • 어떤 앱이 책임이 있습니까?
  • 어떻게 고칠 수 있습니까? freetds의 일부가 여기에 로그인 (iconv에 대해)
iconv.c:326:tds_iconv_open(0x1e02330, UTF-8)
iconv.c:186:local name for ISO-8859-1 is ISO-8859-1
iconv.c:186:local name for UTF-8 is UTF-8
iconv.c:186:local name for UCS-2LE is UCS-2LE
iconv.c:186:local name for UCS-2BE is UCS-2BE
iconv.c:348:setting up conversions for client charset "UTF-8"
iconv.c:350:preparing iconv for "UTF-8" <-> "UCS-2LE" conversion
iconv.c:389:tds_iconv_open: done
iconv.c:785:setting server single-byte charset to "CP1251"



  • 답변 # 1

    SQL Server 2019를 사용하는 경우 _UTF8 로 끝나는 데이터 정렬을 사용하려고합니다.   _AS 보다는 . 데이터 정렬 유형에 대한 자세한 내용은 여기에 전체 기사가 있습니다.

    https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-2017#utf-8-support

    이전 MSSQL 2019,

    이것이 Python 3에서 작동한다는 것을 알고 있습니다.

관련 자료

  • 이전 javascript - 클래스가 열려있는 동안 클래스의 다른 모든 요소를 ​​닫습니다
  • 다음 setVisible (true)을 사용하지만 Java Swing Window가 나타나지 않습니다