Perintah SQLCMD tidak dapat memasukkan aksen

19

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.Masalah pemeriksaan

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!

masukkan deskripsi gambar di sini

Oskytar
sumber
1
Apa pengkodean file skrip SQL Anda?
Pondlife
Saya akan pergi dengan ide @ Pondlife. Ambil editor teks (seperti Notepad ++), buka file .sql di sana, buka Pengkodean dan lihat bahwa file Anda tidak ada dalam ANSI (atau pengkodean lain yang tidak didukung). Jika ya, pilih untuk mengonversi file ke hal lain. Saya akan mengatakan UTF8 harus melakukannya. Beritahu kami bagaimana hasilnya.
Marian

Jawaban:

8

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 .

masukkan deskripsi gambar di sini

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.

masukkan deskripsi gambar di sini

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).

Marian
sumber
Hai Marian. Terima kasih lagi. Saya menggunakan fitur 'Transfer Data' dari Navicat, karena saya suka cara ini menghasilkan skrip sql (cepat, file mdf-independen, dan karena sekarang selalu bekerja untuk saya). Saya memeriksa beberapa parameter dalam fitur 'Transfer Data' di Navicat, tetapi saya tidak menemukan cara untuk mengubah encoding file output. Saya harus melakukan beberapa pekerjaan tambahan menggunakan Notepad ++ untuk mengubah penyandian, tetapi ini bukan masalah besar.
Oskytar
Yah, tidak masalah. Meskipun, biasanya, terima kasih di situs ini dikirimkan menggunakan fitur Upvote (panah atas dekat jawabannya) jika jawabannya bermanfaat, atau, jika itu menyelesaikan masalah Anda sepenuhnya, bahkan menggunakan Tanda sebagai jawabannya (Tanda centang di dekat jawaban ) :-). Lihat lebih lanjut di sini, di FAQ .
Marian
Saya mengoreksi komentar terakhir saya: ITU mungkin untuk memilih pengkodean output file ketika menjalankan 'Transfer Data' dengan Navicat.
Oskytar
Keren, jadi sekarang Anda dapat melewati langkah konversi manual. Itu lebih baik.
Marian
2
Jawaban ini sepertinya tidak benar. Saya punya file yang disimpan oleh Notepad ++ di UTF-8. SQLCMD.exe tidak mentransfer karakter dengan benar. Jika saya menyalin konten ke SSMS, itu berfungsi dengan baik. Solusi sebenarnya adalah jawaban yang diberikan oleh swasheck untuk menambahkan param -f 65001.
Tomas Kubes
39

Pilihan lain, salah satu yang saya baru saja belajar, berasal dari para sqlcmddokumentasi . Anda perlu mengatur codepage sqlcmdagar 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

swasheck
sumber
1
Ini baru saja menyelamatkan hidup saya, saya akan melakukan skrip PowerShell untuk membaca file CSV dengan import-csv -encoding UTF8 untuk mendapatkan ini dengan benar. Terima kasih
Spörri
Ini bekerja untuk saya ketika saya harus memasukkan nilai teks Irlandia dengan fadas (á, é, í, ó, ú) ke dalam kolom NVARCHAR
siang hari dan
Ini jawaban yang benar
Pitchmatt
2

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 converting 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.

James K. Lowden
sumber
Hai James, terima kasih banyak atas jawaban terinci Anda. Saya melakukan beberapa tes, dan Sqlcmd.exe tidak menampilkan string yang benar. Ini jelas merupakan masalah tentang bagaimana data dimasukkan.
Oskytar
Menggunakan Sql Profiler, saya men-debug kalimat apa yang dikirim ke SQL SERVER saat menggunakan klien GUI SQl Server. INSERT INTO [ElementType] ([Code], [Name], [Description], [GeometryType], [stringId], [CapturedGeometryType]) VALUES ('ESTACION', 'Estación', 'Estación', 'Estación', 'Multipoint', NULL, 'Titik'); bekerja HALUS, sehingga semua aksen dimasukkan dengan benar !. Itu sama 'masukkan kalimat' yang muncul di skrip sql saya. Haruskah saya menentukan kode karakter dalam file skrip sql?
Oskytar