Ir para o conteúdo

Literais de String mvSQL

O padrão SQL define dois tipos de cadeia de caracteres, cada um com sua própria sintaxe literal.

  • ANSI
  • National

As cadeias de caracteres ANSI representam ASCII e outros conjuntos de caracteres de byte único, como EBCDIC no DB2/i.

As cadeias de caracteres nacionais representam conjuntos de caracteres multibyte, como Unicode.

O padrão SQL define uma sintaxe literal separada para cada tipo de cadeia de caracteres. A sintaxe para uma string ANSI literal é:

'Aristotle''s quotes'

Observe que as aspas simples incorporadas na string literal são escapadas duplicando as aspas simples.

A sintaxe para um literal de string nacional é:

N'Aristotle''s quotes'

mvSQL oferece suporte à sintaxe SQL Standard para literais de cadeias de caracteres ANSI e nacionais.

Nota

Usar a sintaxe literal SQL errada pode resultar em degradação significativa do desempenho. Dada uma coluna que armazena dados em um conjunto de caracteres ANSI, uma condição de pesquisa contendo uma string literal nacional não aproveitará nenhum índice e forçará uma conversão dos valores da coluna.

Alguns mecanismos de banco de dados, como Oracle, não suportam conversões implícitas entre conjuntos de caracteres. Usar a sintaxe literal de cadeia de caracteres apropriada evitará erros e eliminará a necessidade de conversões explícitas.

Disponível em Vinyl 2.1. Melhorado no Vinyl 2.3.

Suporte ao Fornecedor

A menos que documentado de outra forma, os literais de cadeia de caracteres ANSI e National são mapeados diretamente para o equivalente do fornecedor nativo.

MySQL

O MySQL não define uma sintaxe separada para literais de cadeias de caracteres ANSI e nacionais. No MySQL, presume-se que a string literal seja codificada usando o conjunto de caracteres da conexão. Isso significa que a codificação pode variar de acordo com as configurações de conexão. Se a conexão usar uma codificação ANSI (como a codificação padrão latin1), todas as strings serão consideradas ANSI.

Nota

O Vinyl padroniza as conexões MySQL para o conjunto de caracteres UTF-8. Use o parâmetro CharSet para alterar o conjunto de caracteres de conexão MySQL. Por exemplo, para usar o conjunto de caracteres ASCII padrão do MySQL, adicione CharSet=latin1 às configurações avançadas.

MySQL suporta introdutores de conjuntos de caracteres. O "introdutor" é um prefixo adicionado ao início do valor literal da string. O prefixo indica o conjunto de caracteres da string. O Vinyl usa introdutores de conjunto de caracteres para garantir que os dados Unicode possam ser codificados em literais de string, independentemente das configurações de conexão. Por outro lado, se a conexão usar o conjunto de caracteres UTF-8, o introdutor do conjunto de caracteres garante que os dados ASCII sejam passados ao servidor como ASCII, evitando conversões problemáticas.

Na prática, isso significa que uma cadeia de caracteres ANSI literal do mvSQL será traduzida para:

_latin1'Aristotle''s quotes'

Uma string literal de caracteres mvSQL National será traduzida na sintaxe do MySQL como:

_utf8'Aristotle''s quotes'

O MySQL não define tipos de dados de armazenamento separados para tipos de caracteres ANSI e Nacionais. Em vez disso, todos os tipos de string são armazenados em um tipo de dados comum. O conjunto de caracteres determina como os dados são armazenados. O Vinyl mapeia colunas de caracteres MySQL com um conjunto de caracteres Unicode (utf8) para o tipo de string de caracteres nacional neutro correspondente ao fornecedor (por exemplo, NCHAR ou NVARCHAR).

DB2/i

Assim como o MySQL, o DB2/i não possui tipos de dados separados para cadeias de caracteres ANSI e Nacionais. Em vez disso, o CCSID determina a codificação. O CCSID é um número inteiro não assinado de 16 bits. É de natureza semelhante ao LCID do Windows.

Tal como acontece com o MySQL, o Vinyl inspeciona o CCSID para mapear corretamente de um tipo de caractere /i do DB2(por exemplo, VARCHAR) para um tipo de dados de fornecedor neutro do Vinyl (por exemplo, NVARCHAR). Os seguintes CCSIDs serão mapeados para o tipo de dados NVARCHAR:

  • 1200 - UTF-16
  • 1208 - UTF-8
  • 13488 - UCS-2

Por outro lado, ao criar colunas com um tipo de dados de caractere Nacional, o Vinyl define explicitamente o CCSID. Especificamente, o Vinyl define o CCSID para 1208 (UTF-8).

Finalmente, o DB2/i não precisa ter uma sintaxe separada para cadeias de caracteres ANSI e Nacionais. Portanto, a mesma sintaxe é usada para ambos.

Fontes de Dados Não RDBMS

Literais de string nacionais mvSQL não são suportados para fontes de dados não RDBMS, como REST e Salesforce, etc.

Leitura Adicional

https://learn.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support

https://docs.microsoft.com/en-us/sql/t-sql/data-types/constants-transact-sql

https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html