Pergunta

Existe uma maneira de especificar literais de caracteres Unicode em MySQL?

Quero substituir um caractere unicode por um personagem ASCII, algo como o seguinte:

Update MyTbl Set MyFld = Replace(MyFld, "ẏ", "y")

Mas estou usando caracteres ainda mais obscuros que não estão disponíveis na maioria das fontes, então quero poder usar literais de caracteres unicode, algo como

Update MyTbl Set MyFld = Replace(MyFld, "\u1e8f", "y")

Esta instrução SQL está sendo invocada de um script PHP - o primeiro formulário não é apenas ilegível, mas na verdade não funciona!

Foi útil?

Solução 2

Obrigado por suas sugestões, mas acho que o problema estava mais de volta ao sistema.

Há muitos níveis para descompactar, mas até onde eu sei (pelo menos neste servidor) o comando

set names utf8

faz com que o manuseio do UTF-8 funcione corretamente, enquanto

set character set utf8

não.

No meu ambiente, eles estão sendo chamados do PHP usando PDO, para que diferença isso pode fazer.

Obrigado de qualquer maneira!

Outras dicas

Você pode especificar Literais hexadecimais (ou mesmo Literais binários) usando 0x, x'', ou X'':

select  0xC2A2;
select x'C2A2';
select X'C2A2';

Mas estar ciente que o tipo de retorno é uma corda binária, portanto, todo byte é considerado um personagem. Você pode verificar isso com char_length:

select char_length(0xC2A2)

2

Se você quiser UTF-8 Strings em vez disso, você precisa usar convert:

select convert(0xC2A2 using utf8mb4)

E nós podemos ver isso C2 A2 é considerado 1 caractere no UTF-8:

select char_length(convert(0xC2A2 using utf8mb4))

1


Além disso, você não precisa se preocupar com bytes inválidos porque convert irá removê -los automaticamente:

select char_length(convert(0xC1A2 using utf8mb4))

0

Como pode ser visto, a saída é 0 Porque C1 A2 é uma sequência inválida de bytes UTF-8.

Você pode usar o hex e unhex funções, por exemplo:

update mytable set myfield = unhex(replace(hex(myfield),'C383','C3'))

A sintaxe da string mysql é especificada aqui, como você pode ver, não há provisão para sequências de escape numéricas.

No entanto, à medida que você está incorporando o SQL no PHP, você pode calcular os bytes certos no PHP. Verifique se os bytes que você coloca no SQL realmente correspondem ao seu Conjunto de caracteres do cliente.

Há também o char função Isso permitirá o que você queria (fornecendo números de bytes e um nome de charset) e obtendo um char.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top