分类归档: Programming

编程编程编程。。。

【转】为什么要 SET NAMES

大家都知道
SET NAMES x
相当于
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

以下从MySQL5.0官方文档上摘录了相关内容,并翻译,说明了相关系统变量的用处:

What character set is the statement in when it leaves the client?
statement离开客户端的时候是什么字符集?

The server takes the character_set_client system variable to be the character set in which statements are sent by the client.
客户端送过来的statement,服务器认为它的字符集是系统变量character_set_client的值。

What character set should the server translate a statement to after receiving it?
服务器收到一个statement后,会把它转换成什么字符集?

For this, the server uses the character_set_connection and collation_connection system variables. It converts statements sent by the client from character_set_client to character_set_connection (except for string literals that have an introducer such as _latin1 or _utf8). collation_connection is important for comparisons of literal strings. For comparisons of strings with column values, collation_connection does not matter because columns have their own collation, which has a higher collation precedence.
为了这一用途,服务器使用系统变量character_set_connection和collation_connection。它把客户端传来的 statement,从character_set_client字符集转换成character_set_connection字符集(除非字符串中有 类似_latin1或者_utf8的字符集声明)。collation_connection对于字符串的比较是非常重要的。对于字符类型的字段值的比 较,collation_connection是不起作用的。因为字段有自己的collation,有更高的优先级。

What character set should the server translate to before shipping result sets or error messages back to the client?
在结果集由服务器传递给客户端之前,需要转换成什么字符集?

The character_set_results system variable indicates the character set in which the server returns query results to the client. This includes result data such as column values, and result metadata such as column names.
character_set_results系统变量表明了服务器返回查询结果时使用的字符集。返回的数据,有比如字段的值和元数据(例如字段名)。

If you are using the mysql client with auto-reconnect enabled (which is not recommended), it is preferable to use the charset command rather than SET NAMES. For example:
如果你使用mysql客户端的自动重连(不推荐使用),最好用charset命令,而不是SET NAMES。例如:

mysql> charset utf8
Charset changed

The charset command issues a SET NAMES statement, and also changes the default character set that is used if mysql reconnects after the connection has dropped.
charset命令发出了一个SET NAMES语句,并且连接断开后自动重连时使用的缺省字符集也被修改了。

The database character set and collation are used as default values if the table character set and collation are not specified in CREATE TABLE statements. They have no other purpose.
如果CREATE TABLE中没有明确指出字符集和collation,那么database字符集和collation将做为缺省值,它们没有其他的用处。

The character set and collation for the default database can be determined from the values of the character_set_database and collation_database system variables. The server sets these variables whenever the default database changes. If there is no default database, the variables have the same value as the corresponding server-level system variables, character_set_server and collation_server.
缺省database的字符集和collation可以通过系统变量character_set_database和 collation_database查看。服务器当缺省database改变时设置这些变量的值。如果没有缺省的database,这些变量的将与对应 的服务器级的系统变量-character_set_server和collation_server的值相同。

The table character set and collation are used as default values if the column character set and collation are not specified in individual column definitions. The table character set and collation are MySQL extensions; there are no such things in standard SQL.
表的字符集和collation会作为缺省值,如果列的定义中没有指明字符集和collation的话。

Every “character” column (that is, a column of type CHAR, VARCHAR, or TEXT) has a column character set and a column collation.
每个“字符”字段(即CHAR、VARCHAR或者TEXT类型的字段)都有一个字段字符集和字段校验(collation)。

Every character string literal has a character set and a collation.
每个字符串有一个字符集和一个较验。

A character string literal may have an optional character set introducer and COLLATE clause:
每个字符串有一个可选的字符集introducer和COLLATE子句:

[_charset_name]’string’ [COLLATE collation_name]

Examples:

SELECT ‘string’;
SELECT _latin1’string’;
SELECT _latin1’string’ COLLATE latin1_danish_ci;

Read: 39

自动创建selectbox的多级联动下拉框

by GiK

这里面用到了我前面写的那个数据存取对象

<script type="text/javascript">
function $(o) {
return document.getElementById(o);
}

game = {
code : new String(),
lv    : new Number(),
set   : function(code){
    this.code = code;
    switch(code.substr(0,3)){
        case ‘001’:
            game.lv = 3;
            break;
        case ‘002’:
            game.lv = 2;;
            break;
    }
}
}
<?php
$code = array_flip(LJSConfig::$game_level);
?>
game.set(‘<?= array_shift($code) ?>’);
var server_code = "001002003001";
comboBox = {
    target   : $(‘catbox’),//where to add the selectbox
    sels : new Object(),
   
    init : function(){
    this.sels.length = new Number(0);
    for(var i=0; i<4; i++){
        this.sels[i] = document.createElement("select");
        this.sels[i].id = "sl" + i;//set element id
        if(i == 0){
        this.sels[i].onchange = function(){
          comboBox.selectChange(this.id.charAt(this.id.length – 1));
          comboBox.hide(game.lv);
        }
        } else {
        this.sels[i].onchange = function(){
          comboBox.selectChange(this.id.charAt(this.id.length – 1));
        }
        }
        this.sels.length++;
        this.target.appendChild(this.sels[i]);
    }
    this.createOptions("0",this.sels[0]);
    this.selectChange(0,1);
    },
   
    selectChange : function (level)
{
    level = new Number(level); //change type to number
    var selectObj = this.sels[level];
    if(level == 0){
      game.set(selectObj.value);
    }
    if( level >= game.lv )
    {return;}
   
    var nextSelectObj = this.sels[level+1];
    nextSelectObj.options.length = 0;//clear next select box
    nextSelectObj.style.display = "";
    var currentCode = selectObj.value;
    this.createOptions(currentCode,nextSelectObj);
   
    if( ( level + 1 ) < game.lv )
      comboBox.selectChange( level + 1 ,nextSelectObj);
},
   
    createOptions : function( code, sel){
    var datas = code == "0" ? cat.getlevel(1) : cat.getsub( code );
    for(var item in datas)
    {
      if(item != ‘len’)
      {
        var op = document.createElement("option");
        op.text = datas[item].name;
        op.value = item;
        if(server_code && item == server_code.substr(0,item.length)){
          op.selected = ‘true’;
        }
        sel.options.add( op );
      }
    }
    },
   
    hide : function(level){
    for(var i = this.sels.length; i > level; i–){
        if(this.sels[i])
         this.sels[i].style.display = "none";
    }
    }
}
comboBox.init();
</script>

Read: 954

[转] JQUERY中简单使用AJAX

JQuery第14天里说到了Ajax:同时给了几个读取数据的例子,jquery没有Prototypre的严谨与规范,但利于普通开发的快速上手,也算是各有千秋吧,要是结合两者,我想更是事倍功倍,虽然说两者加起来快近80K,但这个年代带宽应该不是问题了,AJAXModule

I’m trying something a little different today. It took me a while to figure out why I couldn’t open a free account with YouTube for about 3 weeks but now that it’s all straightened out I thought I’d upload a video where I walk you through some of the basic ways you could use jquery to add AJAX functionality to your site.

The video is short because my understanding of YouTube is that I have to limit the file to 10 minutes. Not everything I’ve said in the tutorial is 100% correct. There are minor mistakes such as the part where I call cgi a “server side script” when it would be more accurate to say “server side language”.

Cut me some slack… woodya?英文全文

Demos » AJAX Plugin

Loaded from an HTML File

Code:

$("div#html").load("ajax-test.html");
Loaded from an XML File

Code:

$.get("ajax-test.xml",function(xml){
var text = $("title",xml).text();
$("div#xml").html("<h1>"+text+"</h1>");
});
Loaded from a Dynamic HTML File

Code:

$("div#dhtml").load("html.cgi",{name:"John"});
Loaded from a Dynamic XML File

Code:

$.post("XML.cgi",{
name: "John"
},function(xml){
var text = $("title",xml).text();
$("div#dxml").html("<h2>"+text+"</h2>");
});
Loaded from a Text File

Code:

$.get("ajax-test.txt",function(txt){
$("div#txt").html("<h1>"+txt+"</h1>");
});

Read: 215

【原创】一个简单数据存取的对象

最近刚好要做个有联动的分类选择,就写了下面这个东西,令人郁闷的javascript

cat = {
data : function (code,name,price,discount){
    this.code = code;
    this.name = name;
    this.price = price;
    this.discount = discount;
},
get : function(code){
    if (!code || code.length % 3 != 0 || code.length < 3)
    {
      return false;
    }
    if(cat.getlevel(code.length / 3)[code]){
      return cat.getlevel(code.length / 3)[code];
    } else {
      return false;
    }
},

add : function (code,name,price,discount){
    if(!cat["lv_" + code.length / 3 ]){
      cat["lv_" + code.length / 3 ]     = new Object();
      cat["lv_" + code.length / 3 ].len = 0;
    }
    cat["lv_" + code.length / 3 ][code] = new cat.data(code,name,price,discount );
    cat["lv_" + code.length / 3 ].len++;
},

getlevel : function (level){
    if(cat["lv_" + level]){
      return cat["lv_" + level]
    } else {
      return false;
    }
},

getsub : function( code ){
    code = new String(code);
    datas = new Object();
    level = code.length / 3 + 1;
    sub   = cat.getlevel(level);
    count = 0;
    for(var item in sub){
      if(sub[item].code){
        if(sub[item].code.substr(0,code.length) == code ){
          datas[sub[item].code] = sub[item];
          count++;
        }
      }
    }
    datas.len = count;
    if(count == 0){return false;}
    return datas;
}
}

附部份测试数据

cat.add(‘001′,’魔兽世界’);
cat.add(‘001001′,’一区’);
cat.add(‘001001001′,’伊瑟拉’);
cat.add(‘001001001001′,’联盟’,’0.2617′,’1.00′);
cat.add(‘001001001002′,’部落’,’0.6229′,’1.00′);
cat.add(‘001001002′,’卡德罗斯’);
cat.add(‘001001002001′,’联盟’,’0.3297′,’1.00′);
cat.add(‘001001002002′,’部落’,’0.7794′,’1.00′);
cat.add(‘001001003′,’卡扎克’);
cat.add(‘001001003001′,’联盟’,’0.9082′,’1.00′);
cat.add(‘001001003002′,’部落’,’0.2026′,’1.00′);
cat.add(‘001001004′,’回音山’);
cat.add(‘001001004001′,’联盟’,’0.2884′,’1.00′);
cat.add(‘001001004002′,’部落’,’0.8341′,’1.00′);
cat.add(‘001001005′,’国王之谷’);

还是感觉好麻烦 做联动的时候还是很郁闷啊····没有什么好办法

我太笨了

Read: 819

[C相关]链表的c语言实现

准备:动态内存分配
一、为什么用动态内存分配
但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数组:
float score[30];
但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?
在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道该班级的学生的人数,那么你就要把数组定义得足够大。这样,你的程序在运行时就 申请了固定大小的你认为足够大的内存空间。即使你知道该班级的学生数,但是如果因为某种特殊原因人数有增加或者减少,你又必须重新去修改程序,扩大数组的 存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费 大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。
那么有没有其它的方法来解决这样的外呢体呢?有,那就是动态内存分配。
所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空 间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:
1、不需要预先分配存储空间;
2、分配的空间可以根据程序的需要扩大或缩小。
二、如何实现动态内存分配及其管理
要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数
1、malloc函数
malloc函数的原型为:
void *malloc (unsigned int size)
其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有 一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操 作。
下例是一个动态分配的程序例题(1):
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
main()
{
int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/
if((array=(int *) malloc(10*sizeof(int)))==NULL)
{
printf("不能成功分配存储空间。");
exit(1);
}
for (count=0;count<10;count++) /*给数组赋值*/
array[count]=count;
for(count=0;count<10;count++) /*打印数组元素*/
printf("%2d",array[count]);
free(array);
}
上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array(int *) malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:
1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
2)把此整型指针地址赋给array
3)检测返回值是否为NULL
2、free函数
由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。
其函数原型是:
void free(void *p)
作用是释放指针p所指向的内存区。
其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。
注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2) /*或者free(p2)*/
malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。
malloc函数是对存储区域进行分配的。
free函数是释放已经不用的内存区域的。
所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。

本节课后
问题:
1、free函数有什么用处?
2、stdio.h、stdlib.h、malloc.h 这三个头文件在程序例题(1)中起到了什么作用?
3、#include <stdio.h>和#incluce "stdio.h"有什么不同?
体会:
1、对照程序例题(1)体会“(array=(int *) malloc(10*sizeof(int)))==NULL”这一句的写法。
目的:
1、为什么要“动态分配内存”,如何做到“动态内存分配”。

Read: 807