2010-03-02 9 views
46

Acabo de programar mis proxies almacenados de SQL Server, definiciones de tabla, etc. utilizando SQL Server Management Studio, e intenté agregarlos a mi repositorio de control de fuente Mercurial. Se agregaron muy bien, pero ahora cuando los cambio y los diferencio, Mercurial los llama "archivos binarios" y no me da una diferencia unificada apropiada.¿Por qué Mercurial cree que mis archivos SQL son binarios?

Pensé que la codificación podría ser un problema, así que traté de regenerar los scripts y especificar ANSI para el resultado del archivo de texto, pero obtengo el mismo comportamiento. Puedo verlos perfectamente en el bloc de notas sin que aparezcan personajes extraños. ¿Por qué Mercurial cree que estos archivos son binarios?

De lo contrario, si alguien puede recomendar una buena herramienta para crear una base de datos de SQL Server que podría no causar este problema, eso también podría funcionar.

Respuesta

37

Me he encontrado con este problema porque SQL Server Management Studio guarda los archivos como Unicode. Los primeros dos bytes (la mayoría de las veces) de un archivo de texto Unicode definen la codificación. La mayoría de los editores de texto más nuevos (por ejemplo, el Bloc de notas) lo manejan de forma transparente.

Es probable que los dos primeros bytes sean su problema. Pueden parecer ÿþ. O FF FE en hex.

En el botón "Guardar" en el cuadro de diálogo Guardar hay una lista de selección. Seleccione "Guardar con codificación ..." y seleccione "US-ASCII-Codepage20127". Creo que esta configuración es pegajosa y se mantendrá para futuras grabaciones.

+5

Para ser claros, no es Unicode el problema. Es UTF-16, que tiene nulos incorporados. UTF-8 no lo hace, a menos que realmente use U + 0000 (que un archivo SQL generalmente no usaría). –

+7

Es bueno saber por qué hg piensa que es binario, pero será mejor encontrar una solución para mercurial que lo obligue a cambiar de opinión. Volver a guardar todos los scripts es una solución fea. El problema está en mercurial, no en los archivos. – Stan

+1

La respuesta funcionó para mí, pero utilicé "Unicode (UTF-8 sin firma) - Página de códigos 65001" en lugar de ASCII –

4

Según the docs, se considera binario si hay bytes nulos en el archivo. Los archivos SQL no deberían tener bytes nulos, así que lo verificaría primero (intente buscar en un editor hexadecimal). Supongo que usted sabe que puede forzar a diff para tratarlo como texto

3

Andrew tiene razón; es un byte NUL en algún lugar (supongo que sería un Byte Order Mark al principio insertado por una herramienta de editor grosero). Sin embargo, no se preocupe, a diferencia de SVN o CVS, Mercurial no maneja el texto binario o el texto de manera diferente. Es muestra diferentes cuando haces 'hg log', pero no se manejan de manera diferente.

Próximamente, mercurial libera BOM de casos especiales y no les permite activar el comportamiento de "el usuario probablemente no quiera ver una diferencia de este en la consola".

+0

De hecho, llegamos a la conclusión de que no podemos manejar UTF-16 o UTF-32 de una manera consistente que funcione en Windows. Consulte: http://mercurial.markmail.org/thread/lsoj7dj47mx6xoyx El formato de parche no puede manejar caracteres que no sean ASCII: -/Sugerencias bienvenidas (en la lista de correo, por favor). –

1

Me encontré con esto al editar un archivo de procedimientos almacenados desde SQL Server en Linux y usando git. Git pensó que era un archivo binario porque el archivo de SQL Server era UTF-16 y, por lo tanto, contenía NUL. Mi solución para esto fue emacs, que te permite cambiar la codificación a UTF-8.

0

Sé que es un poco tarde, pero se me ocurrió una secuencia de comandos para guardar por lotes los archivos * .sql en UTF-8.

La respuesta completa está publicada en otro hilo en StackOverflow, así que simplemente publicaré el enlace aquí - https://stackoverflow.com/a/9743360/336079.

0

Tuve un problema similar y decidí usar una herramienta que se encuentra en http://www.devio.at/index.php/smoscript para ayudarme a resolver el problema. Grabé SMOscript colocando lo siguiente en un archivo 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 

La idea es eliminar la carpeta antigua manera que los objetos eliminados de la base de datos se eliminarán de control de código fuente. Esto también guarda los archivos como UTF8 sin ningún sellado de fecha/hora, por lo que funcionan muy bien en el control de la versión.

Cuestiones relacionadas