¿Función MySQL CHAR () y salida UTF8?

+ -------------------------- + ---------------------- ---------------------------------- + | Nombre_variable | Valor | + -------------------------- + ---------------------- ---------------------------------- + | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binario | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql-5.1.41-osx10.5-x86_64/share/charsets/ | + -------------------------- + ---------------------- ---------------------------------- + 8 filas en conjunto (0.00 seg) mysql> seleccionar versión (); + ----------- + | versión () | + ----------- + | 5.1.41 | + ----------- + 1 fila en el conjunto (0.00 seg) mysql> select char (0x00FC); + -------------- + | char (0x00FC) | + -------------- + | ? | + -------------- + 1 fila en conjunto (0.00 seg)

Esperando el carácter utf8 real -> "ü" en lugar de "?" Intenté char (0x00FC usando utf8) también, pero no fue así.

Usando mysql versión 5.1.41

He estado en Google, no puedo encontrar nada sobre esto. Los documentos de MySQL simplemente dicen que se espera una salida multibyte en valores superiores a 255, después de la versión 5.0.14 de mysql.

Muchas Gracias

preguntado el 04 de marzo de 10 a las 23:03

¿Qué conjunto de caracteres usa tu caparazón? -

2 Respuestas

Está confundiendo UTF-8 con Unicode.

0x00FC es el Unicode punto de código para ü:

mysql> select char(0x00FC using ucs2);
+----------------------+
| char(0x00FC using ucs2) |
+----------------------+
| ü                   | 
+----------------------+

In UTF-8 codificación, 0x00FC está representado por dos bytes:

mysql> select char(0xC3BC using utf8);
+-------------------------+
| char(0xC3BC using utf8) |
+-------------------------+
| ü                      | 
+-------------------------+

UTF-8 es simplemente una forma de codificación Caracteres Unicode en forma binaria. Está destinado a ser eficiente en el espacio, por lo que los caracteres ASCII solo toman un byte, y los caracteres iso-8859-1 como ü solo toman dos bytes. Algunos otros caracteres ocupan tres o cuatro bytes, pero son mucho menos comunes.

respondido 05 mar '10, 03:03

¡¡¡¡Muchas gracias!!!! He estado buscando la cláusula "using" durante las últimas dos horas, ¡sin saber cómo se llamaba! ¡Gracias! - Cyberdancer91

Hola Martin y @ Cyberdancer91: Para aclarar, UTF-8 fue no destinado a ahorrar espacio (un malentendido muy común). Estaba destinado a ser compatible con ASCII, una forma de que los sistemas admitieran Unicode sin romper ningún archivo de texto / configuración existente, lo que habría requerido TONELADAS de tiempo de prueba / corrección. Los primeros 128 caracteres que ahorran 1 byte son solo un efecto secundario; 63k de 65k caracteres BMP toman 1 byte EXTRA. Consulte las dos notas a pie de página (y otra información relevante) en mi publicación: sqlquantumleap.com/2018/09/28/… y mi respuesta a continuación. - Salomón Rutzky

Añadiendo a La respuesta de Martin:

  1. Puede utilizar un "introductor" en lugar del CHAR() función. Para hacer esto, especifica la codificación, prefijado con un guión bajo, antes del punto de código:

    _utf16 0xFC
    

    o bien:

    _utf16 0x00FC
    
  2. Si el objetivo es especificar el punto de código en lugar de la secuencia de bytes codificada, entonces necesita usar una codificación en la que el valor del punto de código simplemente sea la secuencia de bytes codificada. Por ejemplo, como se muestra en la respuesta de Martin, 0x00FC es el valor del punto de código para ü y la secuencia de bytes codificada para ucs2 / utf16 (son efectivamente la misma codificación para caracteres BMP, pero prefiero usar "utf16" ya que es consistente con "utf8" y "utf32", consistente en el tema "utf").

    Pero, utf16 solo funciona para caracteres BMP (puntos de código U + 0000 - U + FFFF) en términos de especificar el valor del punto de código. Si desea un carácter complementario, deberá utilizar el utf32 codificación. No solo lo hace _utf32 0xFC retorno ü, pero:

    _utf32 0x1F47E
    

    devuelve: 👾

Para obtener más detalles sobre estas opciones, además de secuencias de escape Unicode para otros idiomas y plataformas, consulte mi publicación:

Secuencias de escape Unicode en varios idiomas y plataformas (incluidos caracteres complementarios)

Respondido el 27 de junio de 19 a las 07:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.