SQLCMD 명령이 악센트를 삽입 할 수 없습니다


19

명령 줄에서 새 데이터베이스를 설정하기 위해 sqlcmd.exe 를 실행하려고합니다 . Windows 7 64 비트에서 SQL SERVER Express 2012를 사용하고 있습니다.

내가 사용하는 명령은 다음과 같습니다.

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log 

다음은 sql 파일 작성 스크립트의 일부입니다.

    CREATE DATABASE aqualogy 
    COLLATE Modern_Spanish_CI_AS
    WITH TRUSTWORTHY ON, DB_CHAINING ON;
    GO
    use aqualogy
    GO
    CREATE TABLE [dbo].[BaseLayers] (
    [Code] nchar(100) NOT NULL ,
    [Geometry] nvarchar(MAX) NOT NULL ,
    [IsActive] bit NOT NULL DEFAULT ((1)) 
    )

    EXEC sp_updateextendedproperty @name = N'MS_Description', @value = N'Capas de     cartografía base de la aplicaicón. Consideramos en Galia Móvil la cartografía(...)'
, @level0type = 'SCHEMA', @level0name = N'dbo'
, @level1type = 'TABLE', @level1name = N'BaseLayers'

글에 악센트가 있는지 확인하십시오. 이것은 테이블의 설명입니다. 데이터베이스는 문제없이 생성됩니다. 첨부 된 스크린 샷에서 볼 수 있듯이 스크립트는 '콜라 테'를 이해합니다. 그럼에도 불구하고 테이블을 검사 할 때 악센트가 제대로 표시되지 않습니다.데이터 정렬 문제

도움을 주셔서 감사합니다. 대단히 감사합니다.

[편집] : 모두 안녕. Notepad ++를 사용하여 SQL 파일 인코딩을 변경하면 정상적으로 작동합니다! 도와 주셔서 감사합니다.이 문제에서 흥미로운 것을 배웠습니다!

여기에 이미지 설명을 입력하십시오


1
SQL 스크립트 파일의 인코딩은 무엇입니까?
Pondlife

@Pondlife의 아이디어와 함께 갈 것입니다. 메모장 ++와 같은 텍스트 편집기를 잡고 거기에서 .sql 파일을 열고 인코딩으로 이동하여 파일이 ANSI (또는 지원되지 않는 다른 인코딩)가 아닌지 확인하십시오. 그렇다면 파일을 다른 것으로 변환하도록 선택하십시오. UTF8 이해 야한다고 말하고 싶습니다. 어떻게되었는지 알려주십시오.
Marian

답변:


8

주석에서와 같이, 문제점은 테이블이나 SQLCMD가 특수 문자를 가져 오는 방식과 정확히 일치하지 않습니다. 일반적으로 문제가있는 가져 오기는 스크립트 자체의 형식과 관련이 있습니다.

Management Studio 자체는 특정 인코딩으로 저장할 수있는 옵션을 제공하므로 향후 문제를 해결할 것입니다. 파일을 처음 저장하거나 다른 이름으로 저장 을 사용하는 경우 저장 버튼 근처의 작은 화살표를 클릭 하여 인코딩으로 저장 옵션을 사용해야합니다 .

여기에 이미지 설명을 입력하십시오

기본적으로 파일은 서유럽 어 (1252)로 저장 됩니다. 특수 문자가있을 때마다 UTF8을 사용합니다 (다른 제한적인 인코딩이 적합 할 수도 있음). 일반적으로 가장 빠른 수정이기 때문입니다.

여기에 이미지 설명을 입력하십시오

SSMS를 사용하고 있는지 확실하지 않으므로 그림 편집기에서 파일을 다른 인코딩으로 저장하는 옵션이 있는지 확인하십시오. 그렇지 않은 경우, 메모장 편집기에서 이미 시도한 것처럼 스마트 편집기에서 파일을 변환하면 일반적으로 작동합니다. 넓은 인코딩에서 더 좁은 인코딩으로 변환 한 다음 다시 넓은 인코딩으로 변환하면 작동하지 않을 수 있습니다 (예 : 유니 코드에서 ANSI로, 다시 유니 코드로).


안녕 마리안. 다시 감사합니다. Navicat의 'Data Transfer'기능을 사용했습니다 .SQL 스크립트 생성 방법이 마음에 들기 때문입니다 (빠르고 mdf 파일에 독립적이며 지금부터 항상 작동했습니다). Navicat의 'Data Transfer'기능에서 일부 매개 변수를 확인했지만 출력 파일 인코딩을 변경하는 방법을 찾지 못했습니다. 인코딩을 변경하려면 메모장 ++를 사용하여 추가 작업을 수행해야하지만 큰 문제는 아닙니다.
Oskytar

문제 없습니다 일반적으로이 사이트의 답변은 답변이 유용한 경우 Upvote 기능 (답변 근처의 위쪽 화살표)을 사용하여 제공되거나 문제가 완전히 해결 된 경우 답변으로 표시 (답변 근처의 확인 표시)를 사용하여 제공됩니다 ) :-). FAQ 에서 자세한 내용을 참조하십시오 .
Marian

마지막 의견을 수정합니다. Navicat으로 '데이터 전송'을 실행할 때 파일 출력 인코딩을 선택할 수 있습니다.
Oskytar

차갑게되었으므로 이제 수동 변환 단계를 무시할 수 있습니다. 더 좋습니다.
Marian

2
이 답변이 올바르지 않은 것 같습니다. 메모장 ++에서 UTF-8로 파일을 저장했습니다. SQLCMD.exe가 문자를 올바르게 전송하지 않습니다. 내용을 SSMS에 복사하면 정상적으로 작동합니다. 진짜 해결책은 65001. -f 추가 PARAM에 swasheck에서 제공하는 대답이었다
토마스 Kubes

39

방금 배운 다른 옵션 sqlcmddocumentation 에서 제공됩니다 . sqlcmd파일 인코딩과 일치 하도록 코드 페이지를 설정해야합니다 . UTF-8의 경우 코드 페이지는 65001이므로 다음을 원합니다.

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001


1
이것은 방금 생명을 구했습니다. import-csv -encoding UTF8로 CSV 파일을 읽으려면 powershell 스크립트를 사용하려고했습니다. 감사합니다
Spörri

내가 NVARCHAR 컬럼에 fadas (á, é, í, ó, ú)와 아일랜드어 텍스트 값을 삽입했을 때 이것은 나를 위해 일한
noonand

정답입니다
Pitchmatt

2

이런 종류의 일은 당신에게 말하지 않고 많은 일을하기 때문에 매우 까다 롭습니다.

가장 먼저 할 일은 sqlcmd를 사용하여 문자열을 표시하는 것입니다. cmd.exe 창에 올바르게 표시되면 유용한 정보입니다. 다음으로 convert문자열을 varbinary 행으로 선택하여 실제로 어떤 바이트가 있는지 확인합니다. 내 생각 cartografía가 로 표시됩니다 0x636172746f67726166c3ad61악센트 "나는"바이트 c3ad, 그 문자의 UTF-8 인코딩 인에 의해 표현된다. Modern Spanish 열에 UTF-8이 있으면 좋지 않습니다 (Windows 1252). 해당 문자에 대한 Windows 1252의 바이트 값은 10 진수 237 (16 진 ED)입니다.

열에 잘못 인코딩 된 데이터가 있으면 오류가 삽입 된 방식에 있습니다. 아마도 문자열 상수에서 선행 N을 제거하면 N'string'SQL Server에 유니 코드 문자열을 생성하도록 'string'지시 하지만 일반 은 문자가 클라이언트의 인코딩을 사용한다는 것을 나타냅니다. 유니 코드 대신 Modern Spanish를 삽입합니다.

열에 올바르게 인코딩 된 데이터가 있으면 GUI 디스플레이에서 버그를 발견했다고 말할 수 있습니다.

sqlcmd가 데이터를 올바르게 삽입 할 수 없다면 (N을 선도하거나하지 않음) Microsoft에 불만을 제기하려고합니다. 당신이 할 때, 열에 저장된대로 바이트를 보여줄 수 있다는 convert(colname as varbinary)것은 무엇이 잘못되었는지 설명하는 데 중요합니다.


제임스 안녕하세요, 자세한 답변에 감사드립니다. 몇 가지 테스트를했는데 Sqlcmd.exe가 올바른 문자열을 표시 하지 않습니다 . 데이터가 어떻게 삽입되는지에 대한 문제입니다.
Oskytar

Sql Profiler를 사용하여 SQl Server GUI 클라이언트를 사용할 때 SQL SERVER로 전송 된 문장을 디버깅했습니다. INSERT INTO [ElementType] ([코드], [이름], [설명], [GeometryType], [stringId], [CapturedGeometryType]) VALUES ( 'ESTACION', 'Estación', 'Estación', 'Multipoint', NULL, '포인트'); FINE을 사용하여 모든 악센트가 올바르게 삽입되었습니다!. 그것은 내 SQL 스크립트에 나타나는 동일한 '삽입 문장'입니다. SQL 스크립트 파일에 문자 코드를 지정해야합니까?
Oskytar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.