服务器 频道

Mysql的字符串、数字

IT168 服务器学院
   一个字符串是一个字符序列,由单引号(“''”)或双引号(“"”)字符(后者只有你不在ANSI模式运行)包围。例如:

''a string''
"another string"

    在字符串内,某个顺序有特殊的意义。这些顺序的每一个以一条反斜线(“\”)开始,称为转义字符。MySQL识别下列转义字符:

\0
一个ASCII 0 (NUL)字符。
\n
一个新行符。
\t
一个定位符。
\r
一个回车符。
\b
一个退格符。
\''
一个单引号(“''”)符。
\"
一个双引号(“"”)符。
\\
一个反斜线(“\”)符。
\%
一个“%”符。它用于在正文中搜索“%”的文字实例,否则这里“%”将解释为一个通配符。
\_
    一个“_”符。它用于在正文中搜索“_”的文字实例,否则这里“_”将解释为一个通配符。
注意,如果你在某些正文环境中使用“\%”或“\%_”,这些将返回字符串“\%”和“\_”而不是“%”和“_”。

    有几种方法在一个字符串内包括引号:

一个字符串内用“''”加引号的“''”可以被写作为“''''”。
一个字符串内用“"”加引号的“"”可以被写作为“""”。
你可以把一个转义字符(“\”)放在引号前面。
一个字符串内用“"”加引号的“''”不需要特殊对待而且不必被重复或转义。同理,一个字符串内用“''”加引号的与“"”也不需要特殊对待。
下面显示的SELECT演示引号和转义如何工作:

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 "This\nIs\nFour\nlines";
+--------------------+
| This
Is
Four
lines |
+--------------------+
 
    如果你想要把二进制数据插入到一个BLOB列,下列字符必须由转义序列表示:

NUL
ASCII 0。你应该用''\0''(一个反斜线和一个ASCII ''0'')表示它。
\
ASCII 92,反斜线。用''\\''表示。
''
ASCII 39,单引号。用“\''”表示。
"
ASCII 34,双引号。用“\"”表示。
    如果你写C代码,你可以使用C API函数mysql_escape_string()来为INSERT语句转义字符。见20.3 C API 函数概述。在 Perl中,你可以使用DBI包中的quote方法变换特殊的字符到正确的转义序列。见20.5.2 DBI接口。

    你应该在任何可能包含上述任何特殊字符的字符串上使用转义函数!

     数字
    整数表示为一个数字顺序。浮点数使用“.”作为一个十进制分隔符。这两种类型的数字可以前置“-”表明一个负值。

有效整数的例子:

1221
0
-32

有效浮点数的例子:

294.42
-32032.6809e+10
148.00

    一个整数可以在浮点上下文使用;它解释为等值的浮点数。

    十六进制值
    MySQL支持十六进制值。在数字上下文,它们表现类似于一个整数(64位精度)。在字符串上下文,它们表现类似于一个二进制字符串,这里每一对十六进制数字被变换为一个字符。

mysql> SELECT 0xa+0
       -> 10
mysql> select 0x5061756c;
       -> Paul

   十六进制字符串经常被ODBC使用,给出BLOB列的值。

    NULL值
    NULL值意味着“无数据”并且不同于例如数字类型的0为或字符串类型的空字符串。见18.15 NULL值问题。

   当使用文本文件导入或导出格式(LOAD DATA INFILE, SELECT ... INTO OUTFILE)时,NULL可以用\N表示。见7.16 LOAD DATA INFILE句法。

   


数据库、表、索引、列和别名的名字都遵守MySQL同样的规则:

    注意,从MySQL3.23.6开始规则改变了,此时我们引入了用''引用的标识符(数据库、表和列命名)(如果你以ANSI模式运行,"也将用于引用标识符)。

标识符  最大长度  允许的字符 
数据库 64 在一个目录名允许的任何字符,除了/. 
表 64 在文件名中允许的任何字符,除了/或. 
列 64 所有字符
别名 255 所有字符

    注意,除了以上,你在一个标识符中不能有ASCII(0)或ASCII(255)。

    注意,如果标识符是一个限制词或包含特殊字符,当你使用它时,你必须总是用`引用它:

SELECT * from `select` where `select`.id > 100;

    在 MySQL的先前版本,命名规则如下:

    一个名字可以包含来自当前字符集的数字字母的字符和“_”和“$”。缺省字符集是ISO-8859-1 Latin1;这可以通过重新编译MySQL来改变。见9.1.1 用于数据和排序的字符集。
一个名字可以以在一个名字中合法的任何字符开始。特别地,一个名字可以以一个数字开始(这不同于许多其他的数据库系统!)。然而,一个名字不能仅仅由数字组成。
你不能在名字中使用“.”,因为它被用来扩充格式,你能用它引用列(见下面)。
建议你不使用象1e这样的名字,因为一个表达式如1e+1是二义性的。它可以解释为表达式1e + 1或数字1e+1。

    在MySQL中,你能使用下列表格的任何一种引用列:

    列引用  含义 
    col_name  来自于任意表的列col_name,用于包含该表的一个列的查询中
tbl_name.col_name  来自当前的数据库的表tbl_name的列col_name
db_name.tbl_name.col_name  行列col_name从表格tbl_name数据库db_name。这个形式在MySQL3.22或以后版本可用。 
`column_name`  是一个关键词或包含特殊字符的列。 

    在一条语句的列引用中,你不必指定一个tbl_name或db_name.tbl_name前缀,除非引用会有二义性。例如,假定表t1和t2,每个均包含列c,并且你用一个使用t1和t2的SELECT语句检索c。在这种情况下,c有二义性,因为它在使用表的语句中不是唯一的,因此你必须通过写出t1.c或t2.c来指明你想要哪个表。同样,如果你从数据库db1中一个表t和在数据库db2的一个表t检索,你必须用db1.t.col_name和db2.t.col_name引用这些数据表的列。

    句法.tbl_name意味着在当前的数据库中的表tbl_name,该句法为了ODBC的兼容性被接受,因为一些ODBC程序用一个“.”字符作为数据库表名的前缀。

    名字的大小写敏感性
    在MySQL中,数据库和表对应于在那些目录下的目录和文件,因而,内在的操作系统的敏感性决定数据库和表命名的大小写敏感性。这意味着数据库和表名在Unix上是区分大小写的,而在Win32上忽略大小写。

    注意:在Win32上,尽管数据库和表名是忽略大小写的,你不应该在同一个查询中使用不同的大小写来引用一个给定的数据库和表。下列查询将不工作,因为它作为my_table和作为MY_TABLE引用一个表:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

列名在所有情况下都是忽略大小写的。

表的别名是区分大小写的。下列查询将不工作,: 因为它用a和A引用别名:

mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;

    列的别名是忽略大小写的

0
相关文章