{"id":1104,"date":"2012-01-10T20:00:46","date_gmt":"2012-01-10T22:00:46","guid":{"rendered":"http:\/\/fabriciolima.net\/blog\/?p=1104"},"modified":"2017-03-15T21:34:42","modified_gmt":"2017-03-16T00:34:42","slug":"casos-do-dia-a-dia-erro-de-collation-em-uma-consulta","status":"publish","type":"post","link":"https:\/\/fabriciolima.net\/blog\/2012\/01\/10\/casos-do-dia-a-dia-erro-de-collation-em-uma-consulta\/","title":{"rendered":"Casos do Dia a Dia &#8211; Erro de Collation em uma Consulta"},"content":{"rendered":"<p>Fala Pessoal,<\/p>\n<p>O foco desse post n\u00e3o \u00e9 explicar o que \u00e9 uma collation, mas sim contar uma experi\u00eancia de duas situa\u00e7\u00f5es que j\u00e1 passei.<\/p>\n<p>Quando instalamos o SQL Server ele possui uma collation default chamada <strong>SQL_Latin1_General_CP1_CI_AS<\/strong>. Eu particularmente, utilizo na maioria das vezes a collation <strong>SQL_Latin1_General_CP1_CI_AI<\/strong>.<\/p>\n<p>Agora, imaginem que voc\u00eas por algum motivo possuam bases com diferentes collations em um servidor e precisem de dar um join entre duas tabelas dessas bases. O que voc\u00ea faria?<\/p>\n<p>Para simular essa situa\u00e7\u00e3o, criei duas databases com collations diferentes:<\/p>\n<ul>\n<li>DBTeste1 com a <strong>collate SQL_Latin1_General_CP1_CS_AS<\/strong><\/li>\n<li>DBTeste2 com <strong>a collate SQL_Latin1_General_CP1_CI_AI<\/strong><\/li>\n<\/ul>\n<p>Em seguida, criei uma tabela em cada database para tentar fazer um join entre elas por um campo char.<\/p>\n<pre class=\"lang:tsql decode:true\">\r\nUSE DBTeste1\r\nUSE DBTeste1\r\n\r\nCREATE TABLE Cliente(Nr_CPF CHAR(11))\r\nINSERT INTO Cliente VALUES('11111111111')\r\n\r\nGO\r\n\r\nUSE DBTeste2\r\n\r\nCREATE TABLE Funcionario(Nr_CPF CHAR(11))\r\nINSERT INTO Funcionario VALUES('11111111111')\r\n<\/pre>\n<p>Ao tentar executar esse join:<\/p>\n<pre class=\"lang:tsql decode:true\">\r\nSELECT *\r\nFROM DBTeste1..Cliente A\r\nJOIN DBTeste2..Funcionario B ON A.Nr_CPF = B.Nr_CPF\r\n<\/pre>\n<p>Recebi o erro abaixo:<\/p>\n<p><a href=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1106\" title=\"ErroCollation\" src=\"https:\/\/www.fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1.png\" alt=\"\" width=\"978\" height=\"67\" srcset=\"https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1.png 978w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1-300x21.png 300w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1-768x53.png 768w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1-700x48.png 700w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1-410x28.png 410w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1-100x7.png 100w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1-275x19.png 275w, https:\/\/fabriciolima.net\/blog\/wp-content\/uploads\/2012\/01\/ErroCollation1-20x1.png 20w\" sizes=\"auto, (max-width: 978px) 100vw, 978px\" \/><\/a><\/p>\n<p>Nessa mesma hora algu\u00e9m vai te perguntar se \u00e9 poss\u00edvel alterar a Collation de uma dessas databases (isso j\u00e1 aconteceu comigo). Entretanto, alterar a collation de uma database pode gerar problemas em outras queries.<\/p>\n<p>Para sair dessa situa\u00e7\u00e3o, voc\u00ea pode converter a collation de uma das tabelas antes de realizar a compara\u00e7\u00e3o no join:<\/p>\n<pre class=\"lang:tsql decode:true\">SELECT *\r\nFROM DBTeste1..Cliente A\r\nJOIN DBTeste2..Funcionario B on A.Nr_CPF COLLATE SQL_Latin1_General_CP1_CI_AI = B.Nr_CPF\r\n<\/pre>\n<p>Parece m\u00e1gica mas agora a query rodou com sucesso. Nesse exemplo, o comando <em><b>collate SQL_Latin1_General_CP1_CI_AI<\/b><\/em> realiza algo parecido com um CAST, convertendo a coluna A.Nr_CPF para outra collation.<\/p>\n<p>Outra situa\u00e7\u00e3o em que essa convers\u00e3o me ajudou foi a seguinte:<\/p>\n<p>Uma pessoa estava precisando retirar todos os acentos de uma coluna para utilizar em uma compara\u00e7\u00e3o e tamb\u00e9m me falaram que algu\u00e9m j\u00e1 tinha feito uma fun\u00e7\u00e3o massa que varria toda a string e fazia essa opera\u00e7\u00e3o.<\/p>\n<p>Contudo, bastava converter a collation conforme o exemplo abaixo para retirar toda acentua\u00e7\u00e3o dessas colunas:<\/p>\n<pre class=\"lang:tsql decode:true\">\r\nDeclare @String varchar(30)\r\nSet @String = 'aeiou\u00e1\u00e9\u00ed\u00f3\u00fa\u00e0\u00e8\u00ec\u00f2\u00f2\u00e2\u00ea\u00ee\u00f4\u00fb\u00e3\u00f5\u00e4\u00eb\u00ef\u00f6\u00fc\u00e7'\r\nSelect @String collate sql_latin1_general_cp1251_ci_as\r\n<\/pre>\n<p>Acho que esse c\u00f3digo ficou um pouco mais r\u00e1pido de se fazer do que uma fun\u00e7\u00e3o que varre toda a string. =)<\/p>\n<p><b>OBS:<\/b> Eu j\u00e1 tinha visto esse script em algum lugar na Internet.<\/p>\n<p>&nbsp;<\/p>\n<p><b>Gostou dessa Dica?<\/b><\/p>\n<p>Curta, comente, compartilhe\u2026<\/p>\n<p>Assine meu canal no <a href=\"https:\/\/www.youtube.com\/channel\/UCeBRAO_LLrUdSrOXIywjzRA\" target=\"_blank\">Youtube<\/a> e curta minha p\u00e1gina no <a class=\"external-link wpel-icon-left\" href=\"https:\/\/www.facebook.com\/FabricioLimaSolucoesemBancodeDados\/\" target=\"_blank\" rel=\"nofollow external noopener noreferrer\" data-wpel-link=\"external\">Facebook<\/a> para receber Dicas de Leituras, V\u00eddeos e Eventos sobre SQL Server.<\/p>\n<p>Confira mais experi\u00eancias do Dia a Dia de um DBA no meu <a href=\"https:\/\/www.fabriciolima.net\/cursos-online\/treinamento-tarefas-do-dia-a-dia-de-um-dba-online\/\" target=\"_blank\">Treinamento de Tarefas do Dia a Dia de um DBA<\/a>.<\/p>\n<p>At\u00e9 a pr\u00f3xima.<\/p>\n<p>Fabr\u00edcio Lima<\/p>\n<p>MCITP \u2013 Database Administrator<\/p>\n<p>Consultor e Instrutor SQL Server<\/p>\n<p>Trabalha com SQL Server desde 2006<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala Pessoal, O foco desse post n\u00e3o \u00e9 explicar o que \u00e9 uma collation, mas sim contar uma experi\u00eancia de duas situa\u00e7\u00f5es que j\u00e1 passei. Quando instalamos o SQL Server ele possui uma collation default chamada SQL_Latin1_General_CP1_CI_AS. Eu particularmente, utilizo na maioria das vezes a collation SQL_Latin1_General_CP1_CI_AI. Agora, imaginem que voc\u00eas por algum motivo possuam [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[3,6,280],"tags":[477,482,479,481,475,483,476,480,33,478,474],"class_list":["post-1104","post","type-post","status-publish","format-standard","hentry","category-administracao-de-bd","category-casos-do-dia-a-dia","category-virtual-pass-br","tag-alterar-collation-sql-server","tag-cannot-resolve-the-collation-conflict","tag-collate","tag-collate-sql_latin1_general_cp1251_ci_as","tag-collation","tag-collation-conflict","tag-collation-default-sql-server","tag-converter-collation","tag-sql-server","tag-sql_latin1_general_cp1_ci_ai","tag-sql_latin1_general_cp1_ci_as"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/1104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/comments?post=1104"}],"version-history":[{"count":0,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/posts\/1104\/revisions"}],"wp:attachment":[{"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/media?parent=1104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/categories?post=1104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fabriciolima.net\/blog\/wp-json\/wp\/v2\/tags?post=1104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}