Я пытаюсь запустить 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 ++ работало нормально! Большое спасибо за вашу помощь: я узнал кое-что интересное с этой проблемой!
sql-server
sqlcmd
sql-server-2012
encoding
Oskytar
источник
источник
Ответы:
Что касается комментариев, проблема заключается не только в таблице или в том, как SQLCMD импортирует специальные символы. Обычно проблемный импорт связан с форматом самого скрипта.
Сама Management Studio предлагает возможность сохранения с определенной кодировкой, которая должна решить проблему в будущем. При первом сохранении файла (или использовании сохранения как) вы должны нажать на маленькую стрелку рядом с кнопкой Сохранить , чтобы использовать опцию Сохранить с кодированием .
По умолчанию он сохраняет файл в Западной Европе (1252) . Всякий раз, когда у меня есть какие-либо специальные символы, я использую UTF8 (хотя, возможно, подойдет и другое ограничительное кодирование), потому что обычно это самое быстрое решение.
Я не уверен (из рисунка), что вы используете SSMS, поэтому, пожалуйста, убедитесь, что ваш собственный редактор имеет возможность сохранить файл в другой кодировке. Если нет, преобразование файла в интеллектуальном редакторе (как вы уже пробовали в Notepad ++) обычно работает. Хотя это может не сработать, если вы конвертируете из широкой кодировки в более узкую, а затем обратно в широкую (например, из Unicode в ANSI и обратно в Unicode).
источник
Другой вариант, один , который я только что узнал, приходит от к
sqlcmd
документации . Вам необходимо установить кодовую страницу,sqlcmd
чтобы она соответствовала кодировке файла. В случае UTF-8 кодовая страница - 65001, поэтому вам нужно:SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001
источник
Подобные вещи очень хитры, потому что так много сделано, не сказав вам.
Первое, что я хотел бы сделать, это использовать 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)
- будет иметь решающее значение для объяснения того, что происходит не так.источник