Команда SQLCMD не может вставить акценты

19

Я пытаюсь запустить sqlcmd.exe , чтобы настроить новую базу данных из командной строки. Я использую SQL SERVER Express 2012 на Windows 7 64 бит.

Вот команда, которую я использую:

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'

Что ж, пожалуйста, проверьте, есть ли акценты в словах; это описание таблицы. База данных создана без проблем. «Сортировка» понимается сценарием, как вы можете видеть на прилагаемом скриншоте. Несмотря на это, акценты не отображаются должным образом при рассмотрении таблицы.Проблема сопоставления

Буду очень признателен за любую помощь. Большое спасибо.

[Редактировать]: Привет всем. Изменение кодировки файла SQL с помощью Notepad ++ работало нормально! Большое спасибо за вашу помощь: я узнал кое-что интересное с этой проблемой!

введите описание изображения здесь

Oskytar
источник
1
Какова кодировка вашего файла сценария SQL?
Pondlife
Я бы пошел с идеей @ Pondlife. Возьмите текстовый редактор (например, Notepad ++), откройте там файл .sql, перейдите в раздел «Кодирование» и убедитесь, что ваш файл не находится в формате ANSI (или в другой неподдерживаемой кодировке). Если это так, выберите преобразование файла в другое. Я бы сказал, что UTF8 должен это сделать. Дайте нам знать, как все прошло.
Мариан

Ответы:

8

Что касается комментариев, проблема заключается не только в таблице или в том, как SQLCMD импортирует специальные символы. Обычно проблемный импорт связан с форматом самого скрипта.

Сама Management Studio предлагает возможность сохранения с определенной кодировкой, которая должна решить проблему в будущем. При первом сохранении файла (или использовании сохранения как) вы должны нажать на маленькую стрелку рядом с кнопкой Сохранить , чтобы использовать опцию Сохранить с кодированием .

введите описание изображения здесь

По умолчанию он сохраняет файл в Западной Европе (1252) . Всякий раз, когда у меня есть какие-либо специальные символы, я использую UTF8 (хотя, возможно, подойдет и другое ограничительное кодирование), потому что обычно это самое быстрое решение.

введите описание изображения здесь

Я не уверен (из рисунка), что вы используете SSMS, поэтому, пожалуйста, убедитесь, что ваш собственный редактор имеет возможность сохранить файл в другой кодировке. Если нет, преобразование файла в интеллектуальном редакторе (как вы уже пробовали в Notepad ++) обычно работает. Хотя это может не сработать, если вы конвертируете из широкой кодировки в более узкую, а затем обратно в широкую (например, из Unicode в ANSI и обратно в Unicode).

Мэриан
источник
Привет Мариан. Еще раз спасибо Я использовал функцию «Передача данных» из Navicat, потому что мне нравится, как он генерирует сценарий sql (быстрый, независимый от mdf-файла, и с тех пор всегда работал для меня). Я проверил некоторые параметры в функции «Передача данных» в Navicat, но не нашел способа изменить кодировку выходного файла. Мне придется проделать дополнительную работу, используя Notepad ++, чтобы изменить кодировку, но это не имеет большого значения.
Оскитар
Ну, нет проблем. Хотя обычно благодарность на этом сайте осуществляется с помощью функции Upvote (стрелка вверх рядом с ответом), если ответ полезен, или, если она полностью решает вашу проблему, даже с использованием пометки в качестве ответа (галочка рядом с ответом) ) :-). Подробнее здесь, в FAQ .
Мариан,
Я исправляю свой последний комментарий: при выборе «Передача данных» с помощью Navicat можно выбрать кодировку выходного файла.
Оскитар
Круто, так что теперь вы сможете обойти шаг ручного преобразования. Это даже лучше.
Мариан
2
Этот ответ кажется неправильным. У меня был файл, сохраненный Notepad ++ в UTF-8. SQLCMD.exe не передает символы правильно. Если я копирую контент в SSMS, он работает нормально. Реальным решением был ответ, предоставленный swasheck, на добавление параметра -f 65001.
Томас Кубес
39

Другой вариант, один , который я только что узнал, приходит от к sqlcmdдокументации . Вам необходимо установить кодовую страницу, sqlcmdчтобы она соответствовала кодировке файла. В случае UTF-8 кодовая страница - 65001, поэтому вам нужно:

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

swasheck
источник
1
Это просто спасло мне жизнь, я собирался сделать сценарий powershell для чтения файла CSV с помощью import-csv -encoding UTF8, чтобы все было правильно. Спасибо
Spörri
Это сработало для меня, когда мне пришлось вставить ирландские текстовые значения с помощью fadas (á, é, í, ó, ú) в столбец
NVARCHAR
Это правильный ответ
Pitchmatt
2

Подобные вещи очень хитры, потому что так много сделано, не сказав вам.

Первое, что я хотел бы сделать, это использовать sqlcmd для отображения строки. Если он правильно отображается в окне cmd.exe, это один из полезных фактов. Затем я выбрал бы строку convertстроки в varbinary, чтобы увидеть, какие байты на самом деле там. Я думаю, что cartografía будет отображаться как 0x636172746f67726166c3ad61, где акцентированное «i» представлено байтами c3ad, которые являются кодировкой UTF-8 для этого символа. Нехорошо иметь UTF-8 в современной испанской колонке (Windows 1252). Значение байта в Windows 1252 для этого символа составляет 237 десятичных (шестнадцатеричное ED).

Если столбец содержит неверно закодированные данные, то ошибка заключается в том, как они были вставлены. Возможно, удаление начального N в строковых константах - N'string'говорит SQL Server генерировать строку Unicode, но обычный 'string'указывает, что символы используют кодировку клиента - - вставило бы современный испанский вместо Unicode.

Если в столбце содержатся правильно закодированные данные, я бы сказал, что вы обнаружили ошибку на дисплее графического интерфейса.

Если вы не можете получить sqlcmd для правильной вставки данных (ведущий N или нет), то вы хотите пожаловаться в Microsoft. Когда вы это сделаете, возможность показывать байты как сохраненные в столбце - используя convert(colname as varbinary)- будет иметь решающее значение для объяснения того, что происходит не так.

Джеймс К. Лоуден
источник
Привет Джеймс, большое спасибо за подробный ответ. Я сделал несколько тестов, и Sqlcmd.exe не показывает правильную строку. Это явно проблема о том, как данные вставляются.
Oskytar
Используя Sql Profiler, я отлаживал, какие предложения отправлялись на SQL SERVER при использовании клиента SQl Server GUI. INSERT INTO [ElementType] ([Code], [Name], [Description], [GeometryType], [stringId], [CapturedGeometryType]) VALUES ('ESTACION', 'Estación', 'Estación', 'Multipoint', NULL, 'Точка'); работал отлично, поэтому все акценты были правильно вставлены !. Это то же самое «вставить предложение», которое появляется в моем сценарии sql. Должен ли я указать код символа в файле сценария sql?
Oskytar