Saya mencoba menjalankan sqlcmd.exe untuk mengatur database baru dari baris perintah. Saya menggunakan SQL SERVER Express 2012 pada Windows 7 64 bit.
Inilah perintah yang saya gunakan:
SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log
Dan inilah bagian skrip pembuatan file 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'
Ya, periksa apakah ada aksen pada kata-katanya; yang merupakan deskripsi tabel. Basis data dibuat tanpa masalah. 'Susun' dipahami oleh skrip, seperti yang dapat Anda lihat di tangkapan layar terlampir. Meskipun demikian, aksen tidak ditampilkan dengan benar saat memeriksa tabel.
Saya sangat menghargai bantuan apa pun. Terima kasih banyak.
[Sunting]: Hai semua. Mengubah pengkodean file SQL menggunakan Notepad ++ bekerja dengan baik! Terima kasih banyak atas bantuannya: Saya belajar sesuatu yang menarik dengan masalah ini!
sumber
Jawaban:
Seperti dari komentar, masalahnya bukan pada tabel atau cara SQLCMD mengimpor karakter khusus. Biasanya, impor bermasalah terkait dengan format skrip itu sendiri.
Management Studio sendiri menawarkan opsi penghematan dengan pengkodean tertentu, yang akan menyelesaikan masalah di masa mendatang. Saat menyimpan file untuk pertama kalinya (atau gunakan save as) Anda harus mengklik panah kecil di dekat tombol Simpan , untuk menggunakan opsi Simpan dengan penyandian .
Secara default ia menyimpan file di Eropa Barat (1252) . Setiap kali saya memiliki karakter khusus, saya menggunakan UTF8 (walaupun mungkin beberapa pengkodean terbatas lainnya akan cocok) karena biasanya perbaikan tercepat.
Saya tidak yakin (dari foto) bahwa Anda menggunakan SSMS, jadi pastikan editor Anda memiliki opsi untuk menyimpan file dalam pengkodean yang berbeda. Jika tidak, mengonversi file dalam editor cerdas (seperti yang sudah Anda coba di Notepad ++) biasanya berfungsi. Meskipun itu mungkin tidak berfungsi jika Anda mengonversi dari pengkodean lebar ke pengkodean yang lebih sempit dan kemudian kembali ke pengkodean yang luas (misalnya: dari Unicode ke ANSI dan kembali ke Unicode).
sumber
Pilihan lain, salah satu yang saya baru saja belajar, berasal dari para
sqlcmd
dokumentasi . Anda perlu mengatur codepagesqlcmd
agar cocok dengan pengkodean file. Dalam kasus UTF-8, codepage adalah 65001 sehingga Anda ingin:SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001
sumber
Hal semacam ini sangat rumit karena begitu banyak yang dilakukan tanpa memberi tahu Anda.
Hal pertama yang akan saya lakukan adalah menggunakan sqlcmd untuk menampilkan string. Jika ditampilkan dengan benar di jendela cmd.exe, itu adalah satu fakta yang berguna. Selanjutnya, saya akan memilih baris
convert
ing string ke varbinary untuk melihat byte apa yang sebenarnya ada. Saya pikir cartografía akan muncul sebagai0x636172746f67726166c3ad61
, di mana aksen "i" diwakili oleh byte c3ad, yang merupakan pengkodean UTF-8 untuk karakter itu. Tidak ada gunanya memiliki UTF-8 di kolom Modern Spanyol (Windows 1252). Nilai byte pada Windows 1252 untuk karakter itu adalah 237 desimal (hex ED).Jika kolom menyimpan data yang salah kode, maka kesalahannya terletak pada bagaimana data itu dimasukkan. Mungkin menghapus N terkemuka di konstanta string -
N'string'
memberitahu SQL Server untuk menghasilkan string Unicode, tetapi jelas'string'
menunjukkan karakter menggunakan pengkodean klien - akan memasukkan bahasa Spanyol Modern alih-alih Unicode.Jika kolom menyimpan data yang disandikan dengan benar, maka saya akan mengatakan Anda menemukan bug di layar GUI.
Jika Anda tidak bisa mendapatkan sqlcmd untuk memasukkan data dengan benar (mengarah N atau tidak), maka Anda ingin mengadu ke Microsoft. Ketika Anda melakukannya, bisa menunjukkan byte yang disimpan di kolom - menggunakan
convert(colname as varbinary)
- akan sangat penting untuk menjelaskan apa yang salah.sumber