Задавайте вопросы, мы ответим
Вы не зашли.
SELECT t.`link` FROM (SELECT CONCAT('/новости/региональные/', 1, '.html') AS link) AS t;
SELECT CONCAT('/новости/региональные/', 1, '.html') AS link;
Не смотря на видимую схожесть запросов, первый возвращает строку переконвертированную в юникод, причем часть строки теряется, в второй все выводит нормально русскими буквами. Если же 1 написать как строку, проблемы нет, точно так же само как и при использовании латиницы.
Кто подскажет почему?
Неактивен
После некоторого времени, проведенного с документацией, часть проблемы стала понятной. В concat число конвертируется в его бинальное представление. Оставшийся вопрос - почему с латиницей не возникает проблем?
Неактивен
Ай, какая красота!
Для начала — чем эти случаи отличаются. Подзапрос рассматривается MySQL
просто как таблица, из которой можно вытаскивать данные. У таблицы всегда
должна быть фиксированная структура столбцов.
Структуру столбцов можно попробовать угадать вот так:
[silentia] root test > CREATE TABLE x SELECT CONCAT('ы', 1); Query OK, 1 row affected, 1 warning (0.02 sec) Records: 1 Duplicates: 0 Warnings: 1 [silentia] root test > CREATE TABLE xx SELECT CONCAT('ы', '1'); Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 [silentia] root test > SHOW CREATE TABLE x\G *************************** 1. row *************************** Table: x Create Table: CREATE TABLE `x` ( `CONCAT('ы', 1)` varbinary(2) NOT NULL DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 1 row in set (0.00 sec) [silentia] root test > SHOW CREATE TABLE xx\G *************************** 1. row *************************** Table: xx Create Table: CREATE TABLE `xx` ( `CONCAT('ы', '1')` varchar(2) CHARACTER SET utf8 NOT NULL DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
Тут мы видим, что (ровно так, как написано в документации) тип CONCAT
двух строк — строка, а CONCAT строки и числа — двоичная последователь-
ность. Единственная ошибка MySQL, которую я тут вижу, — это то, что при
создании последовательности он использует CHAR_LENGTH(), а не LENGTH()
при подсчете длины строки. То, что оказывается правильным для строки,
не является правильным для двоичной последовательности
http://bugs.mysql.com/bug.php?id=45780 — та же ошибка, но чуть другие данные.
Неактивен