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);
Показать запрос ** как код **, а не только как * изображение * кода. –
Пробовал использовать значение? W/o MySQL преобразует его в число. – MrTux
Используйте цитаты для сравнения строк! – sagi