2016-10-13 5 views
1

мой пункт SQL:Почему mysql 'select where clause' запрашивает ошибку?

SELECT * FROM dev_userdb.ry_usercard where UserIdentity=610528194506235115 

img

UserIdentity является тип VARCHAR (64) .Когда я выполнить запрос, результат не то, что я хочу, почему?

+2

Показать запрос ** как код **, а не только как * изображение * кода. –

+1

Пробовал использовать значение? W/o MySQL преобразует его в число. – MrTux

+0

Используйте цитаты для сравнения строк! – sagi

ответ

6

UserIdentity является тип VARCHAR (64)

Тогда ваш запрос должен использовать кавычки значение, которое вы запрашиваете, например,

...userIdentity = '601528194506235115' 

Причина в результате вы получаете объясняетесь описанием руководства по MySQL о equality comparisons:

Следующие правила описывают, как происходит преобразование для операций сравнения:

  • если один или оба аргумента равны NULL, результат сравнения равен NULL, за исключением NULL-безопасного < => оператора сравнения равенства. Для NULL < => NULL результат верен. Преобразование не требуется.

  • Если оба аргумента в операции сравнения являются строками, они сравниваются как строки.

  • Если оба аргумента являются целыми числами, они сравниваются как целые числа.

  • Шестнадцатеричные значения рассматриваются как двоичные строки, если их не сравнить с числом.

  • Если один из аргументов является столбцом TIMESTAMP или DATETIME, а другой аргумент является константой, константа преобразуется в метку времени перед выполнением сравнения. Это сделано, чтобы быть более дружественным ODBC. Обратите внимание, что это не делается для аргументов IN()! Чтобы быть в безопасности, всегда используйте полные даты, дату или временные строки при выполнении сравнений. Например, для достижения наилучших результатов при использовании BETWEEN с датами или значениями времени используйте CAST(), чтобы явно преобразовать значения в нужный тип данных.

  • Подзапрос из одной строки из таблицы или таблиц не считается константой. Например, если подзапрос возвращает целое число, сравниваемое с значением DATETIME, сравнение выполняется как два целых числа. Целое число не преобразуется во временное значение. Чтобы сравнить операнды как значения DATETIME, используйте CAST(), чтобы явно преобразовать значение подзапроса в DATETIME.

  • Если один из аргументов является десятичным значением, сравнение зависит от другого аргумента. Аргументы сравниваются как десятичные значения, если другой аргумент является десятичным или целочисленным значением или значениями с плавающей запятой, если другой аргумент является значением с плавающей запятой.

  • Во всех остальных случаях аргументы сравниваются как числа с плавающей запятой (реальные).

Ваше сравнение заканчивается с помощью этого правила, лат с плавающей точкой сравнения чисел.

floating-point numbers, используемый MySQL, - это IEEE-754 одноточечная («плавающая») или двоякая с плавающей запятой двойной точности (double); по-видимому, он использует удвоение для вышеупомянутого (вы думаете, они скажут).

Двунаправленная с плавающей запятой двойной точности IEEE-754 имеет примерно 15 цифр десятичной точности. В частности, могут быть представлены только некоторые целые числа, превышающие 9007199254740992 (например, 9007199254740993); 601528194506235115 хорошо находится в диапазоне, где имеются большие промежутки между представляемыми целыми числами. Если вы попытаетесь сохранить 601528194506235115 в двойном размере, вы получите 601528194506235100; это то, что вы получаете, когда пытаетесь сохранить 601528194506235117 и 601528194506235118 в парном разряде. Поэтому после '601528194506235117', '601528194506235118' и 601528194506235115 все конвертированы в двойные, чтобы сравнить их в вашем запросе, все они 601528194506235100, и поэтому все они равны. (FWIW, следующий представима целое после 601528194506235100 является 601528194506235300.)

номера JavaScript являются также удваивается, так что мы можем увидеть эффект, используя JavaScript здесь на сайте:

var table = [ 
 
    '42', 
 
    '754', 
 
    '601528194506235117', 
 
    '601528194506235118', 
 
    '27' 
 
]; 
 
var matches = table.filter(function(num) { 
 
    return +num === 601528194506235115; 
 
}); 
 
console.log("matching entries:"); 
 
console.log(matches);

+0

Спасибо, я знаю, что ваш ответ правильный. Но я хочу, как mysql обрабатывает SQL-запрос и почему результат это ? – Farb

+1

@Farb: Разъяснение выше. –

+0

Этот ответ - это то, что я хочу. <3 – Farb

0

типа UserIdentity varchar (64), поэтому вы должны использовать кавычки вокруг значения.

select * from table_name where UserIdentity = 'value';