utf-8, MySQL - Data too long for column

snitko

Новичок
utf-8, MySQL - Data too long for column

Возникла любопытная проблема, решение которой не могу найти.

Вот запрос к БД:

PHP:
$alias=mb_substr($alias, 0, 128, 'UTF-8');
mysqli_query($db_connection, 
   'INSERT INTO wapmarks (url_id, alias, uid, date)
    VALUES (\''.$url_id.'\', \''.$alias.'\', '.$uid.', \''.$this->date.'\'
);
Получаю ошибку: Data too long for column 'alias' at row 1

$alias - строка в кодировке utf-8
кодировка БД и таблицы - utf-8
тип столбца alias - varchar(128)

Подскажите пожалуйста, wtf?
 

kruglov

Новичок
Ммм, не надо ее переводить, надо ее в поиск вбивать. Можно даже в местный
 

snitko

Новичок
kruglov, прошу прощения, не посмотрел поиск. Показалось, что проблема не слишком известная. Тем не менее, в найденных топиках ответа не нашел.
 

HraKK

Мудак
Команда форума
Какой нафиг баг.
Ищи лучше. А лучше ЧУУУУУУУть чуть подумай. Учти что UTF8 1 символ занимает 4
 

snitko

Новичок
HraKK
Внимательно смотрел код? mb_substr обрезает строку до 128 символов указанной кодировки, varchar(128) считает символы кодировки utf-8, а не байты.

-~{}~ 12.09.07 02:58:

Решение найдено:
закомментировать строку:
Код:
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
в my.ini
 

dimagolov

Новичок
snitko, а теперь запросите из базы то что запихнули и посмотрите длину.
мое предположение №1 - будет 31 символ, №2 - 127.

потому что
If strict SQL mode is not enabled and you assign a value to a CHAR or VARCHAR column that exceeds the column's maximum length, the value is truncated to fit and a warning is generated. For truncation of non-space characters, you can cause an error to occur (rather than a warning) and suppress insertion of the value by using strict SQL mode. See Section 5.2.6, “SQL Modes”.
то есть изменение sql-mode привело просто к обрезанию без ошибки, а не к изменению поведения БД в плане вмещается/не вмещается
 

SiMM

Новичок
> Учти что UTF8 1 символ занимает 4
Это с какого перепугу, хотелось бы знать?
http://ru.wikipedia.org/wiki/Unicode#UTF-8
> мое предположение №1 - будет 31 символ, №2 - 127.
№3 - strlen (а не mb_strlen) даст 128.
 
Сверху