2012-06-13 9 views
5

Estoy usando una columna TEXT que es ut8_unicode_ci en mysql para almacenar algunos datos que se extraen de Internet.longitud máxima de mysql en columnas y asegurando que no sobrepase ese límite usando utf8_unicode_ci - PHP?

Los textos que se recopilan provienen de varios sitios en diferentes idiomas.

estoy consiguiendo confundido con la longitud máxima de 65535 bytes para una columna TEXT.

¿Cómo puedo verificar que las cadenas que estoy insertando en la columna no superen ese límite?

En el momento en que estoy usando strlen($str) para comprobar la longitud de las cuerdas, pero mediante el uso de esto es asegurarse de que que los datos no serán truncados para encajar en la columna como entiendo utf8_unicode_ci puede haber más de 1 byte por personaje?

+0

¿Intentaste usar mb_strlen()? http://php.net/manual/es/function.mb-strlen.php –

+0

Sí, pero en todos los casos donde 'mb_strlen ($ str)! = strlen ($ str)' el resultado real de 'strlen' es más de eso de 'mb_strlen', y el resultado de' mb_strlen' cuenta caracteres de varios bytes como 1 – hadley

+0

No es una solución, pero podría salir con MEDIUMTEXT (16777215 caracteres) o LONGTEXT (caracteres 4294967295) si se está quedando sin espacio con Solo texto. – AleksanderKseniya

Respuesta

3

EDIT: El PO puede simplemente utilizar strlen() a medida que regresa bytes, no caracteres. Testigo:

$ cat test.php 
#!/usr/bin/php -q 
<?php 
echo strlen("דותן כהן")."\n"; 
echo mb_strlen("דותן כהן", "UTF-8")."\n"; 
?> 

$ ./test.php 
15 
8 

crédito va a deceze en un comentario a este mensaje.

Antiguo post de abajo:

Las notas del manual de PHP tienen a handy function for determining how many bytes are in a string. Parece ser la única alternativa al uso de MYSQL built in functions such as LENGTH to do the job, que sería engorroso aquí.

Existen otras dos soluciones posibles. En primer lugar, puede escribir la cadena en un archivo y verificar el tamaño del archivo. En segundo lugar, puede forzar la codificación ASCII en mb_strlen y luego tratará cada byte como un carácter, por lo que la cantidad de caracteres que devuelve es en realidad la cantidad de bytes. No lo he probado, así que revísalo primero. ¡Háganos saber lo que funciona para usted!

+0

Lo que realmente necesita hacer es usar ['strlen'] (http://php.net/strlen), punto. Escribir la cadena en un archivo y verificar su tamaño es lo mismo que usar 'strlen', que es simplemente contar bytes. – deceze

+0

'strlen' cuenta bytes. Es una de las funciones básicas ingenuas de PHP que supone que un byte equivale a un personaje. 'strlen ('漢')' devuelve '3', porque cuenta bytes, mientras' mb_strlen ('漢', 'UTF-8') 'cuenta correctamente los caracteres y devuelve' 1'. – deceze

+0

@deceze: Estás en lo cierto. Acabo de probar con 'strlen (" דותן כהן ")' y 'mb_strlen (" דותן כהן "," UTF-8 ")'. El primero imprime 15 mientras que el segundo imprime 8. ¡Muchas gracias! – dotancohen

0

Pedido función de MySQL LONGITUD():

Devuelve la longitud de la cadena str, medida en bytes. Un carácter de varios bytes cuenta como bytes múltiples. Esto significa que para una cadena que contiene cinco caracteres de dos bytes, LONGITUD() devuelve 10, mientras que CHAR_LENGTH() devuelve 5.