SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.02.2011 13:35:03

nikolajtesla
Завсегдатай
Зарегистрирован: 12.10.2010
Сообщений: 25

непонятные проблемы с кодировкой

SELECT t.`link` FROM (SELECT CONCAT('/новости/региональные/', 1, '.html') AS link) AS t;
SELECT CONCAT('/новости/региональные/', 1, '.html') AS link;

Не смотря на видимую схожесть запросов, первый возвращает строку переконвертированную в юникод, причем часть строки теряется, в второй все выводит нормально русскими буквами. Если же 1 написать как строку, проблемы нет, точно так же само как и при использовании латиницы.

Кто подскажет почему?

Неактивен

 

#2 08.02.2011 13:41:14

nikolajtesla
Завсегдатай
Зарегистрирован: 12.10.2010
Сообщений: 25

Re: непонятные проблемы с кодировкой

После некоторого времени, проведенного с документацией, часть проблемы стала понятной. В concat число конвертируется в его бинальное представление. Оставшийся вопрос - почему с латиницей не возникает проблем?

Неактивен

 

#3 09.02.2011 01:57:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: непонятные проблемы с кодировкой

Ай, какая красота! smile

Для начала — чем эти случаи отличаются. Подзапрос рассматривается 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()
при подсчете длины строки. То, что оказывается правильным для строки,
не является правильным для двоичной последовательности smile

http://bugs.mysql.com/bug.php?id=45780 — та же ошибка, но чуть другие данные.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson