美高梅棋牌官网下载-美高梅棋牌官方版下载

大家可以在美高梅棋牌官网下载当中进行野外生存的游戏、也可以泡泡温泉、吃吃烧烤,美高梅棋牌官方版下载成为卓越不凡的超级娱乐企业巨头,注册可提款,通过该系统的运作,以最为合适的娱乐方式将客户传递到最佳平台。

不应该是保留关键字才对,因为在双引号内引用

2020-01-28 15:24栏目:美高梅棋牌官网下载
TAG:

前几天帮同事解决一个案例,在主从复制环境下,从库上的MySQL版本号是5.5.5,遇到下面的错误:

字符串常量

字符串是包含在单引号(')或双引号(")字符中的字节或字符序列。
以下几行例子是等同的:

'a string'
"a string"
'a' ' ' 'string'

如果ANSI_QUOTES启用了SQL模式,则字符串文字只能在单引号内引用,因为在双引号内引用的字符串被解释为标识符。

  • 二进制字符串是一组字节。每个二进制字符串都有一个名为binary的字符集和排序规则。
  • 非二进制的字符串是一组字符。它具有二进制以外的字符集和与字符集兼容的排序规则。

对于这两种类型的字符串,比较都是基于字符串单元的数值。
对于二进制字符集,单位是字节,使用字节值进行比较;
对于非二进制字符集,单位是字符和字符集支持多字节字符,使用数值进行比较;

一个字符串文字可以有一个可选的字符集introducer和COLLATE clause,用来指定它是一个使用特定字符集和排序规则的字符串:

[_charset_name]'string' [COLLATE collation_name]
// 例子
SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8'string' COLLATE utf8_danish_ci;

在一个字符串中,某些序列具有特殊的含义,除非NO_BACKSLASH_ESCAPES启用了SQL模式。这些序列中的每一个都以反斜杠()开始,称为转义字符

图片 1

image.png

这些%_序列用于搜索模式匹配上下文中的文字实例,%_解释为通配符。

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', ''hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", ""hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT 'ThisnIsnFournLines';
+--------------------+
| This
Is
Four
Lines |
+--------------------+

mysql> SELECT 'disappearing backslash';
+------------------------+
| disappearing backslash |
+------------------------+

在编写应用程序时,任何可能包含任何这些特殊字符的字符串必须在将该字符串用作发送到MySQL服务器的SQL语句中的数据值之前正确转义。

你可以通过两种方式来做到这一点:

  • 使用转义特殊字符的函数处理字符串。
  • 作为显式转义特殊字符的替代方法,许多MySQL API提供了一个占位符功能,使您能够将特殊标记插入到语句字符串中,然后在发出语句时将数据值绑定到它们。在这种情况下,API会负责为您转义值中的特殊字符。
#其他非相关信息我都隐藏掉了 [(yejr@imysql.com)] show slave status G; Slave_IO_Running: Yes Slave_SQL_Running: No Last_Errno: 1064 Last_Error: Error 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '6e86db84_14847168f19__8000' at line 1' on query. Default database: 'act'. Query: 'SAVEPOINT 6e86db84_14847168f19__8000' Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 1064 Last_SQL_Error: Error 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '6e86db84_14847168f19__8000' at line 1' on query. Default database: 'act_log'. Query: 'SAVEPOINT 6e86db84_14847168f19__8000'

数字常量

数字文字包括精确值(整数)和 DECIMAL文字和近似值(浮点)文字。

FLOATDOUBLE是浮点类型,其计算结果是近似值。

第一感觉是遇到保留关键字了,不过看到这么长的字符串,不应该是保留关键字才对。经过尝试,最后发现是字符串中的 “e” 这个字符如果存在就可能会报错,看起来应该是bug才对了。在MySQL的bug系统里确实找到了这个bug,不过看bug描述,在5.5版本中应该是已经修复了才对,看来太不靠谱了呀~~关于这个bug:Savepoint identifier is occasionally considered as floating point numbers

日期时间常量

日期和时间值可以用多种格式表示,例如带引号的字符串或数字,具体取决于值的确切类型和其他因素。

MySQL使用type关键字,并且这些结构分别生成 DATETIMEDATETIME值,如果指定,则包括尾随小数秒部分。该 TIMESTAMP语法产生 DATETIME在MySQL的价值,因为 DATETIME有更紧密地对应于标准SQL的范围 TIMESTAMP类型,其中有一年范围00019999。(MySQL的TIMESTAMP年份范围是19702038。)

MySQL识别日期/时间比较宽松,通常符合日期/时间规则的都可以被转化成功,具体可以参考链接:https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html。

其实除了升级版本外,解决方法也很简单,把savepoint后面的 identifier 字符串用反引号引用起来就行。例如:

十六进制

SELECT HEX('MySQL'),0x4D7953514C,x'4D7953514C',X'4D7953514C'

默认情况下,十六进制文字是一个二进制字符串,其中每对十六进制数字表示一个字符。

版权声明:本文由美高梅棋牌官网下载发布于美高梅棋牌官网下载,转载请注明出处:不应该是保留关键字才对,因为在双引号内引用