2010-03-02 33 views
46

Tôi chỉ viết kịch bản các procs được lưu trữ trong SQL Server, các định nghĩa bảng, v.v. sử dụng SQL Server Management Studio và cố gắng thêm chúng vào kho lưu trữ kiểm soát nguồn Mercurial của tôi. Họ đã được thêm vào chỉ là tốt, nhưng bây giờ khi tôi thay đổi và diff chúng, Mercurial gọi chúng là "tập tin nhị phân" và không cho tôi một sự khác biệt thống nhất thích hợp.Tại sao Mercurial nghĩ rằng các tệp SQL của tôi là nhị phân?

Tôi nghĩ rằng mã hóa có thể là một vấn đề, vì vậy tôi đã cố gắng tạo lại các tập lệnh và chỉ định ANSI cho đầu ra tệp văn bản, nhưng tôi nhận được cùng một hành vi. Tôi có thể xem chúng tốt trong notepad mà không có bất kỳ ký tự kỳ lạ nào xuất hiện. Tại sao Mercurial nghĩ rằng các tệp này là nhị phân?

Nếu không, nếu ai đó có thể đề xuất một công cụ tốt để tạo kịch bản cho cơ sở dữ liệu SQL Server có thể không gây ra sự cố này, điều đó cũng có thể hoạt động.

Trả lời

37

Tôi đã gặp sự cố này vì SQL Server Management Studio lưu các tệp dưới dạng Unicode. Hai byte đầu tiên (phần lớn thời gian) của một tệp văn bản Unicode xác định mã hóa. Hầu hết các trình chỉnh sửa văn bản mới hơn (ví dụ: Notepad) đều xử lý điều này một cách minh bạch.

Hai byte đầu tiên có thể là vấn đề của bạn. Chúng có thể trông giống như . Hoặc FF FE trong hex.

Trên nút "Lưu" trên hộp thoại Lưu là danh sách chọn. Chọn "Lưu với mã hóa ..." và chọn "US-ASCII-Codepage20127". Tôi tin rằng thiết lập này là dính và sẽ vẫn cho tiết kiệm trong tương lai.

+5

Để rõ ràng, nó không phải là Unicode đó là vấn đề. Đó là UTF-16, trong đó có nhúng null. UTF-8 không, trừ khi bạn thực sự sử dụng U + 0000 (mà một tập tin SQL thường sẽ không). –

+7

Thật tốt khi biết lý do tại sao hg cho rằng đó là nhị phân, nhưng sẽ tốt hơn nếu tìm một sửa chữa cho mercurial để buộc nó thay đổi ý định của nó. Việc lưu lại tất cả các tập lệnh là giải pháp thay thế xấu. Vấn đề là trong mercurial, không phải trong các tập tin. – Stan

+1

Câu trả lời phù hợp với tôi, nhưng tôi đã sử dụng "Unicode (UTF-8 không có chữ ký) - Codepage 65001" thay vì ASCII –

4

Theo the docs, nó được coi là nhị phân iff có byte trống trong tệp. Các tệp SQL không được có các byte rỗng, vì vậy tôi sẽ kiểm tra xem trước đó (hãy thử tìm trong trình chỉnh sửa hex). Tôi cho rằng bạn biết rằng bạn có thể ép buộc khác để coi nó là văn bản

3

Andrew là đúng; đó là một byte NUL ở đâu đó (dự đoán của tôi sẽ là Byte Order Mark khi bắt đầu được chèn bởi một công cụ biên tập thô lỗ). Đừng lo lắng về nó mặc dù, không giống như SVN hoặc CVS ​​Mercurial không xử lý nhị phân so với văn bản khác nhau ở tất cả. Nó hiển thị chúng khác nhau khi bạn thực hiện 'nhật ký hg', nhưng chúng không được xử lý khác nhau.

Phiên bản đặc biệt về thủy ngân sắp tới Các BOM và không cho phép chúng kích hoạt hành vi "người dùng có thể không muốn thấy sự khác biệt về hành vi này".

+0

Chúng tôi thực sự đi đến kết luận rằng chúng tôi không thể xử lý UTF-16 hoặc UTF-32 theo cách nhất quán sẽ hoạt động trong Windows. Vui lòng xem: http://mercurial.markmail.org/thread/lsoj7dj47mx6xoyx Định dạng bản vá không thể xử lý các ký tự không phải ASCII: -/Đề xuất chào mừng (trên danh sách gửi thư, vui lòng). –

1

Tôi đã gặp phải điều này khi chỉnh sửa tệp thủ tục được lưu trữ từ SQL Server trên Linux và sử dụng git. Git nghĩ rằng đó là một tệp nhị phân vì tệp từ SQL Server là UTF-16 và do đó chứa NUL. Sửa lỗi của tôi cho điều này là emacs, cho phép bạn thay đổi mã hóa thành UTF-8.

0

Tôi biết đã muộn một chút, nhưng tôi đã đưa ra một tập lệnh để lưu hàng loạt tệp * .sql vào UTF-8.

Câu trả lời đầy đủ được đăng trong một chủ đề khác trên StackOverflow, vì vậy tôi sẽ chỉ đăng liên kết tại đây - https://stackoverflow.com/a/9743360/336079.

0

Tôi gặp sự cố tương tự và quyết định sử dụng công cụ có tại số http://www.devio.at/index.php/smoscript để giúp tôi giải quyết vấn đề. Tôi kịch bản SMOscript bằng cách đặt sau đây trong một tập tin cmd.

rd /s /q [the scripts folder] 
"C:\Program Files\devio IT Services\SMOscript\smoscript.exe" -s [server] -d [database] -F [the scripts folder] -U 

Ý tưởng là xóa thư mục cũ để mọi đối tượng bị xóa khỏi cơ sở dữ liệu sẽ bị xóa khỏi điều khiển nguồn. Thao tác này cũng lưu các tệp dưới dạng UTF8 mà không có bất kỳ dấu ngày/giờ nào, vì vậy chúng hoạt động tốt trong điều khiển phiên bản.

Các vấn đề liên quan